Connection Types
Every edge type in WhisperGraph — direction, source and target labels, and the physical-vs-virtual rules that decide how you traverse it.
Connection Types Documentation
Connections are what make a pre-joined graph worth querying. This page lists all 46 edge types — each one's direction, the labels it runs between, and what it means. For the nodes on either end, see Entities; for the chains that string edges across layers, see Pivoting Examples.
Direction matters. Several edges point the opposite way to how you would read them in English — NAMESERVER_FOR and MAIL_FOR run server → domain, so you traverse them backwards to answer "what serves this domain". Each table notes the direction; CALL db.relationshipTypes() returns the live set.
DNS resolution & hierarchy
| Edge | From | To | Description |
|---|---|---|---|
RESOLVES_TO | HOSTNAME | IPV4, IPV6 | A host resolves to an IP (forward only — reverse-DNS via (ip)<-[:RESOLVES_TO]-(h)). |
ALIAS_OF | HOSTNAME | HOSTNAME | A CNAME alias. |
CHILD_OF | HOSTNAME, EMAIL | HOSTNAME, TLD | A subdomain points up to its parent (and to the TLD). |
NAMESERVER_FOR | HOSTNAME | HOSTNAME | A nameserver serves a domain (edge points server → domain). |
MAIL_FOR | HOSTNAME | HOSTNAME | A mail server handles mail for a domain (edge points server → domain). |
LINKS_TO | HOSTNAME | HOSTNAME | A web hyperlink between hosts (the largest edge type, ~10.9B). |
BGP & routing
| Edge | From | To | Description |
|---|---|---|---|
BELONGS_TO | IPV4, IPV6 | PREFIX | An IP falls inside an allocated prefix. (Also reaches FEED_SOURCE → CATEGORY.) |
ANNOUNCED_BY | IPV4, IPV6 | ANNOUNCED_PREFIX | An IP is covered by a BGP-announced prefix. |
ROUTES | ASN | ANNOUNCED_PREFIX, PREFIX | An ASN announces a prefix (matches in either direction). |
HAS_NAME | ASN | ASN_NAME | An ASN's registered network name (asn.name is the AS number; the network name lives on ASN_NAME). |
BGP_NEIGHBOR | ASN | ASN | The canonical ASN↔ASN BGP adjacency edge (PEERS_WITH is accepted as an alias). |
CONFLICTS_WITH | ANNOUNCED_PREFIX | ASN | A multi-origin (MOAS) conflict over a prefix. |
ROA_AUTHORIZES_ORIGIN | ROA | ASN | An RPKI ROA authorizes an AS as origin. |
ROA_AUTHORIZES_PREFIX | ROA | PREFIX | An RPKI ROA authorizes a prefix. |
OPERATES | TLD_OPERATOR | TLD | A registry operates a TLD. |
WHOIS & registration
| Edge | From | To | Description |
|---|---|---|---|
HAS_REGISTRAR | HOSTNAME | REGISTRAR | The domain's current registrar. |
PREV_REGISTRAR | HOSTNAME | REGISTRAR | A prior registrar. |
HAS_EMAIL | HOSTNAME | A WHOIS contact email. | |
HAS_PHONE | HOSTNAME | PHONE | A WHOIS contact phone. |
REGISTERED_BY | HOSTNAME, ASN, PREFIX | ORGANIZATION | The registrant or owning organization. |
SAME_ORG_AS | ORGANIZATION | ORGANIZATION | Two organizations resolved to the same entity. |
Geo
| Edge | From | To | Description |
|---|---|---|---|
LOCATED_IN | IPV4, IPV6 | CITY | An IP's GeoIP city (chain HAS_COUNTRY for the country). |
HAS_COUNTRY | ASN, CITY, IPV4, PHONE | COUNTRY | The associated country. |
Threat intelligence & attribution
| Edge | From | To | Description |
|---|---|---|---|
LISTED_IN | IPV4, IPV6, HOSTNAME | FEED_SOURCE | An indicator appears on a threat feed. |
HAS_SIGNAL | IPV4, IPV6, HOSTNAME, ASN, PREFIX | THREAT_SIGNAL_TYPE | A node carries a threat signal. |
OPERATES_EXIT_NODE | IPV4 | TOR_RELAY | An IP operates a Tor exit relay. |
DELEGATED_TO | PREFIX, IPV4 | VENDOR | Address space operated by a vendor (distinct from the WHOIS owner). |
USES_TECHNIQUE | ACTOR | ATTACK_PATTERN | A threat actor uses a MITRE ATT&CK technique. |
USES_TACTIC | ATTACK_PATTERN | ATTACK_PATTERN | A technique grouped under its ATT&CK tactic. |
Email security (SPF / DMARC / DKIM)
| Edge | From | To | Description |
|---|---|---|---|
SPF_INCLUDE | HOSTNAME | HOSTNAME | An SPF include: mechanism. |
SPF_IP | HOSTNAME | IPV4, IPV6, PREFIX | An SPF ip4:/ip6: authorization. |
SPF_A / SPF_MX / SPF_EXISTS / SPF_REDIRECT | HOSTNAME | HOSTNAME | Other SPF mechanisms. |
DMARC_REPORTS_TO | HOSTNAME | DMARC_RECIPIENT | Where a domain sends DMARC aggregate reports. |
DKIM_SIGNED_BY | HOSTNAME | VENDOR | The mail vendor whose DKIM key signs a domain's outbound mail. |
EMITS_TLS_FINGERPRINT | IPV4 | TLS_FINGERPRINT | An IP presents a JA3/JARM TLS fingerprint. |
EMITS_TLS_FINGERPRINT, DMARC_REPORTS_TO, and DKIM_SIGNED_BY are seed-stage: the edge types are live but coverage is still small, so treat an empty result as no data rather than a negative finding.
Physical infrastructure
| Edge | From | To | Description |
|---|---|---|---|
AS_PRESENT_AT | ASN | FACILITY | A network is present in a datacenter. |
IX_MEMBER | ASN | INTERNET_EXCHANGE | A network is a member of an IXP. |
IX_HOSTED_AT | INTERNET_EXCHANGE | FACILITY | An IXP is hosted in a facility. |
CABLE_LANDS_AT | SUBMARINE_CABLE | CABLE_LANDING | A subsea cable lands at a landing point. |
LANDING_NEAR | CABLE_LANDING | FACILITY | A landing point is near a facility. |
CDN_POP_AT | CDN_POP | FACILITY | A CDN PoP is in a facility. |
FIBER_SEGMENT | FACILITY | FACILITY | A fiber link between facilities (symmetric). |
PREFIX_IN_REGION | PREFIX | CLOUD_REGION | A prefix sits in a cloud region. |
Certificate Transparency
| Edge | From | To | Description |
|---|---|---|---|
SEEN_IN_CT | HOSTNAME | CT_OBSERVATION | A host appears in a Certificate Transparency observation. |
Physical vs. virtual edges
Edge types come in two kinds, and the distinction changes how you write the query.
Physical edges are materialized on disk: the DNS, geo, and SPF sets, the WHOIS set except SAME_ORG_AS, and BELONGS_TO. An unanchored MATCH ()-[r:RESOLVES_TO]->() returns rows.
Virtual edges are synthesized at query time: everything else, including the routing set (ANNOUNCED_BY, ROUTES, HAS_NAME, BGP_NEIGHBOR, CONFLICTS_WITH, the ROA_* pair), the whole threat and attribution set, the DMARC/DKIM/TLS-fingerprint edges, SEEN_IN_CT, and the physical-infrastructure set. Two rules follow:
- Anchor the source node. An unanchored
MATCH ()-[:LISTED_IN]->()returns zero rows. Anchor with a labeled{name: "..."}lookup and traverse in the documented direction. - Write them as explicit single hops. A virtual edge inside a variable-length
[*1..N]pattern silently returns nothing. Split multi-stage traversals withWITH.
A few virtual edges are real and traversable but do not appear in db.relationshipTypes(), because they are synthesized only when you anchor on one end: ROUTES (ASN → ANNOUNCED_PREFIX), HAS_NAME (ASN → ASN_NAME), and the taxonomy hop BELONGS_TO (FEED_SOURCE → CATEGORY). Anchor them and they work; count them globally and you get zero.
CALL db.schema() reports a traversalHints entry for each virtual edge type. See Best Practices for the full set of query rules.
Confirm an edge before you traverse
CALL db.relationshipTypes() YIELD type, sourceLabels, targetLabels
RETURN type, sourceLabels, targetLabels ORDER BY type
db.relationshipTypes() lists every edge type with the source and target labels observed on it, and does not count against your quota. Checking it first — alongside db.labels() — is the fastest cure for silent empty results from a mistyped edge name.