Connection Types

Every edge type in WhisperGraph — direction, source and target labels, and the physical-vs-virtual rules that decide how you traverse it.

Updated July 2026Graph Schema

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

EdgeFromToDescription
RESOLVES_TOHOSTNAMEIPV4, IPV6A host resolves to an IP (forward only — reverse-DNS via (ip)<-[:RESOLVES_TO]-(h)).
ALIAS_OFHOSTNAMEHOSTNAMEA CNAME alias.
CHILD_OFHOSTNAME, EMAILHOSTNAME, TLDA subdomain points up to its parent (and to the TLD).
NAMESERVER_FORHOSTNAMEHOSTNAMEA nameserver serves a domain (edge points server → domain).
MAIL_FORHOSTNAMEHOSTNAMEA mail server handles mail for a domain (edge points server → domain).
LINKS_TOHOSTNAMEHOSTNAMEA web hyperlink between hosts (the largest edge type, ~10.9B).

BGP & routing

EdgeFromToDescription
BELONGS_TOIPV4, IPV6PREFIXAn IP falls inside an allocated prefix. (Also reaches FEED_SOURCE → CATEGORY.)
ANNOUNCED_BYIPV4, IPV6ANNOUNCED_PREFIXAn IP is covered by a BGP-announced prefix.
ROUTESASNANNOUNCED_PREFIX, PREFIXAn ASN announces a prefix (matches in either direction).
HAS_NAMEASNASN_NAMEAn ASN's registered network name (asn.name is the AS number; the network name lives on ASN_NAME).
BGP_NEIGHBORASNASNThe canonical ASN↔ASN BGP adjacency edge (PEERS_WITH is accepted as an alias).
CONFLICTS_WITHANNOUNCED_PREFIXASNA multi-origin (MOAS) conflict over a prefix.
ROA_AUTHORIZES_ORIGINROAASNAn RPKI ROA authorizes an AS as origin.
ROA_AUTHORIZES_PREFIXROAPREFIXAn RPKI ROA authorizes a prefix.
OPERATESTLD_OPERATORTLDA registry operates a TLD.

WHOIS & registration

EdgeFromToDescription
HAS_REGISTRARHOSTNAMEREGISTRARThe domain's current registrar.
PREV_REGISTRARHOSTNAMEREGISTRARA prior registrar.
HAS_EMAILHOSTNAMEEMAILA WHOIS contact email.
HAS_PHONEHOSTNAMEPHONEA WHOIS contact phone.
REGISTERED_BYHOSTNAME, ASN, PREFIXORGANIZATIONThe registrant or owning organization.
SAME_ORG_ASORGANIZATIONORGANIZATIONTwo organizations resolved to the same entity.

Geo

EdgeFromToDescription
LOCATED_INIPV4, IPV6CITYAn IP's GeoIP city (chain HAS_COUNTRY for the country).
HAS_COUNTRYASN, CITY, IPV4, PHONECOUNTRYThe associated country.

Threat intelligence & attribution

EdgeFromToDescription
LISTED_INIPV4, IPV6, HOSTNAMEFEED_SOURCEAn indicator appears on a threat feed.
HAS_SIGNALIPV4, IPV6, HOSTNAME, ASN, PREFIXTHREAT_SIGNAL_TYPEA node carries a threat signal.
OPERATES_EXIT_NODEIPV4TOR_RELAYAn IP operates a Tor exit relay.
DELEGATED_TOPREFIX, IPV4VENDORAddress space operated by a vendor (distinct from the WHOIS owner).
USES_TECHNIQUEACTORATTACK_PATTERNA threat actor uses a MITRE ATT&CK technique.
USES_TACTICATTACK_PATTERNATTACK_PATTERNA technique grouped under its ATT&CK tactic.

Email security (SPF / DMARC / DKIM)

EdgeFromToDescription
SPF_INCLUDEHOSTNAMEHOSTNAMEAn SPF include: mechanism.
SPF_IPHOSTNAMEIPV4, IPV6, PREFIXAn SPF ip4:/ip6: authorization.
SPF_A / SPF_MX / SPF_EXISTS / SPF_REDIRECTHOSTNAMEHOSTNAMEOther SPF mechanisms.
DMARC_REPORTS_TOHOSTNAMEDMARC_RECIPIENTWhere a domain sends DMARC aggregate reports.
DKIM_SIGNED_BYHOSTNAMEVENDORThe mail vendor whose DKIM key signs a domain's outbound mail.
EMITS_TLS_FINGERPRINTIPV4TLS_FINGERPRINTAn 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

EdgeFromToDescription
AS_PRESENT_ATASNFACILITYA network is present in a datacenter.
IX_MEMBERASNINTERNET_EXCHANGEA network is a member of an IXP.
IX_HOSTED_ATINTERNET_EXCHANGEFACILITYAn IXP is hosted in a facility.
CABLE_LANDS_ATSUBMARINE_CABLECABLE_LANDINGA subsea cable lands at a landing point.
LANDING_NEARCABLE_LANDINGFACILITYA landing point is near a facility.
CDN_POP_ATCDN_POPFACILITYA CDN PoP is in a facility.
FIBER_SEGMENTFACILITYFACILITYA fiber link between facilities (symmetric).
PREFIX_IN_REGIONPREFIXCLOUD_REGIONA prefix sits in a cloud region.

Certificate Transparency

EdgeFromToDescription
SEEN_IN_CTHOSTNAMECT_OBSERVATIONA 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 with WITH.

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.