Real-time graph-based fraud detection

JetGraph is a purpose-built in-memory graph engine for fraud and risk decisions. It is a fraud graph for the authorize path — not a case-management suite and not a generic graph database.

What a fraud graph is here

Entities (cards, devices, IPs, merchants, accounts) are nodes. Events and shared-attribute links are edges. Fraud is often a relationship problem: a new card on a device that already has a flagged card; a merchant that suddenly shares devices with a known ring; an IP with exploding distinct-account cardinality.

Signals on the decision path

Velocity

How many transactions (or logins, or authorizations) did this card or account produce in 1 minute / 5 minutes / 1 hour / 24 hours? JetGraph keeps those windows as ring counters so the fraud service does not COUNT(*) at query time. Typical published lookup: ~0.05 ms. See performance.

Novelty

Has this card ever transacted at this merchant? Has this user ever used this device? First-time edges are a standard card-fraud and ATO feature. Check existence before insert so you do not mark the current event as historical.

Relationship context

One- and two-hop neighborhood: devices shared across cards, IPs shared across accounts. Cypher example for a ring (shared device with a flagged card) is in the fraud detection documentation.

Neighbor risk

After a node is flagged, neighbors expose max_neighbor_risk_score and flagged-neighbor counts. The next authorization can read contagion without traversing.

Propagation

Flag is an API call, not a nightly connected-component job. Unflag reverses exposure. This is how a single confirmed fraud node becomes a live graph signal.

Cardinality

HyperLogLog neighbor counts: how many distinct cards hit this device, how many accounts share this IP. High cardinality on a shared identifier is a classic mule/ring tell.

Payment, card, and connected-entity risk

The engine does not decide approve/decline. Your rules or model combine:

  • Transaction velocity on the PAN or token
  • New merchant / new country / new device edges
  • Spend or count windows on related edge types
  • Neighbor fraud score from already-flagged cards or devices
  • Ring queries when you need an explicit shared-device MATCH

Then you always write the event, including declines, so velocity and novelty stay correct. That loop is the same as real-time risk scoring.

What JetGraph is not in fraud

  • Not a chargeback product, device fingerprint vendor, or consortium bureau
  • Not a replacement for 3-D Secure or issuer authorization
  • Not an investigative graph warehouse for year-long multi-hop research (keep Neo4j/warehouse for that if you need it)
Authorization event
  → GetVelocityCount(card)
  → edge_exists(card, merchant)      // novelty
  → GetNodeContext(card)             // neighbor risk
  → optional MATCH ring pattern
  → your score
  → CreateEdge / upsert (always)
  → FlagNode if decline threshold