×marble
all posts
May 27, 2026·12 min read

Property Graphs vs RDF for Recommendations: How to Choose and When to Combine

The graph data model decision shapes every query latency number, every cold-start path, and every entity resolution problem you'll face. Here's how property graphs and RDF triple stores differ where it actually matters — and why the best production systems use both.

Alex Shrestha·Founder, ×marble

Property Graphs vs RDF for Recommendations: How to Choose and When to Combine

TL;DR.

  • Property graphs beat RDF on traversal latency for operational recommendation workloads — index-free adjacency means O(1) per hop; SPARQL over a triple store means O(log n) index resolution per hop, compounding across 3-4 hops.
  • RDF earns its cost when you need ontological inference (OWL/RDFS class hierarchies, owl:sameAs entity resolution) or when you're ingesting from external linked-data sources (Wikidata, MusicBrainz, schema.org) — none of which a property graph handles natively.
  • The framing of "pick one" is the bug. Teams running serious knowledge graph recommenders in production use a layered architecture: RDF for the semantic and enrichment layer, property graph for the operational retrieval layer.
  • In 2026, RDF-star and ISO GQL are narrowing the capability gap — edge properties are now first-class in RDF, and property graphs are gaining named-graph semantics. The choice is now primarily about query execution patterns, not missing features.
  • If you only remember one thing: let your p50 latency budget and your entity resolution requirements make the decision — they point in opposite directions, which is why you usually need both.

The knowledge-graph-vs-vector-database debate gets most of the attention in 2026. But for teams actually building production recommenders, the earlier and more consequential decision is which graph data model to use. Property graphs and RDF triple stores encode fundamentally different theories of what a graph is, how queries execute against it, and what kinds of reasoning it supports. Get this wrong and you spend six months fighting your data model instead of tuning your ranker. The difference is not syntax — it is architecture.

What Is the Actual Difference Between Property Graphs and RDF?

The difference is not storage format. It is a disagreement about what an edge is.

A property graph (standardized in ISO GQL, implemented by Neo4j, TigerGraph, Amazon Neptune with openCypher, and Memgraph) treats nodes and edges as first-class database objects that carry arbitrary key-value properties. An edge like (:User)-[:WATCHED {quality: "completed", at: 1716400000, weight: 0.9}]->(:Item) is a single write carrying typed metadata. There is no global schema enforced by the data model — you can add new relationship types or node labels without a migration. Query languages (Cypher, Gremlin) are built around pattern matching: readable, procedural, tuned for traversal.

RDF (W3C RDF 1.1) treats the graph as a web of meaning. Everything reduces to triples: <subject> <predicate> <object>. Every entity and relationship type is a URI — a globally unique identifier. Edge properties do not exist in base RDF; attaching metadata to a triple required reification (four additional triples per annotation) until RDF-star changed this in 2021. The schema is an ontology: OWL, RDFS, SHACL. SPARQL is the query language — declarative, powerful for inference, verbose for traversal. The payoff is the semantic stack: owl:sameAs for entity resolution across data sources, rdfs:subClassOf for class hierarchy inference, compatibility with the Linked Open Data cloud — Wikidata, DBpedia, MusicBrainz, schema.org.

For recommenders the question is concrete: what does your recommendation loop need at query time? The data model choice is downstream of that question.

Why Property Graphs Win for Real-Time Recommendation Traversals

For p50 < 30 ms recommendation queries, property graphs have a structural latency advantage that does not go away with tuning.

The mechanism is index-free adjacency: in a native property graph store, each node holds direct pointers to its adjacent nodes. Traversing one hop is a pointer dereference — O(1). In an RDF triple store, every hop is resolved by intersecting a subject index with a predicate index and an object index. Even in optimized native triple stores like Stardog or Ontotext GraphDB, multi-hop traversal is a join plan across three indexes per hop. At one hop, the difference is single-digit milliseconds. At 3-4 hops — the depth typical for collaborative filtering patterns — the difference compounds.

The pattern that drives this is standard for item-based collaborative filtering:

MATCH (u:User {id: $userId})-[:WATCHED]->(seen:Item)<-[:WATCHED]-(peer:User)
      -[:WATCHED]->(candidate:Item)
WHERE NOT (u)-[:WATCHED]->(candidate)
  AND candidate.modality = $modality
WITH candidate, count(peer) AS co_watch_signal
ORDER BY co_watch_signal DESC
LIMIT 20
RETURN candidate.id, candidate.title, co_watch_signal

This is a 4-hop traversal: User → Item ← User → Item. On Neo4j with a warm page cache, p50 for this pattern over a graph with 50M edges runs at 3-8 ms. The equivalent SPARQL is structurally valid but the query planner must compute a join plan across multiple indexes, and the URI resolution overhead per hop is not negligible. Production benchmarks from Amazon Neptune's engineering blog consistently show 2-4x higher latency for equivalent traversal workloads on the SPARQL endpoint vs. the openCypher endpoint over the same graph data.

Cypher's ergonomics also matter for iteration speed. A team doing weekly A/B tests on traversal depth, edge filters, or scoring logic ships faster when the query language is readable. The query above maps directly to the mental model. The SPARQL equivalent requires explicit prefix declarations, URI-wrapped predicates, and careful SPARQL property path syntax. It is not harder — it is slower to write and review.

When RDF's Semantic Layer Is the Right Choice

RDF is the right tool when global semantics and ontological inference are load-bearing, not when you need fast traversal.

The clearest use case is cold-start bridging via class hierarchy inference. A new user selects three genres on signup. Your property graph stores (User)-[:SELECTED]->(Concept:Genre). To infer upstream preferences — instrument affinities, tempo ranges, sub-genre neighbors, cross-modal analogues — you need a hierarchy. In an OWL ontology, rdfs:subClassOf chains give a reasoner the ability to traverse "Death Metal → Metal → Rock → Guitar-Driven Music" automatically. The inference is declarative; you state what's true, the reasoner derives consequences without you writing traversal code.

More practically: the major external knowledge bases that power content enrichment are RDF-native. Wikidata — the most useful open knowledge graph for product teams in 2026 — exposes a SPARQL endpoint and publishes RDF dumps. MusicBrainz has a full RDF data model covering artists, recordings, releases, and relationships. schema.org is an RDF vocabulary used by virtually every media publisher for structured metadata. If your content enrichment pipeline touches any of these, you will interact with RDF regardless of your internal data model choice.

owl:sameAs is the other argument. Entity resolution across heterogeneous sources — your internal artist catalog, Wikidata's artist entities, MusicBrainz IDs, Spotify URIs — is a first-class semantic operation in OWL: you assert <your:artist-123> owl:sameAs <wikidata:Q5928> and the reasoner propagates facts across both URIs. In a property graph you implement this with a deduplication pipeline and explicit merge logic. That pipeline is code you maintain; the OWL assertion is a fact in the knowledge base.

A 2021 survey by Hogan et al. (ArXiv:2003.02320) covering knowledge graph theory and applications identifies ontological reasoning and linked-data integration as the structural advantages of RDF that property graphs have not replicated natively. That remains the accurate framing in 2026.

Schema Evolution and the Cold-Start Problem

For teams in active product development — pre-PMF, running weekly experiments, iterating on onboarding flows — property graph schema flexibility is a compounding velocity advantage.

RDF ontologies are powerful, but they are a commitment. Defining a new entity type in OWL means placing it in the class hierarchy, potentially reasoning about subclass relationships, deciding whether it carries cardinality constraints or disjointness axioms. This is the right process for a mature, shared semantic layer. It is a bottleneck for a team that needs to add a SKIPPED negative signal edge or a SYNTHETIC_AFFINITY inference edge this sprint.

Property graphs are schemaless by default — Neo4j enforces constraints only if you explicitly declare them via CREATE CONSTRAINT. A new relationship type appears the moment you write it. A new node label appears the moment you create a node with it. Zero migration ceremony.

This matters acutely for day-zero personalization. In ×marble's model, cold-start signals arrive from onboarding declarations, inferred device and session context, and the synthetic clone layer — a prior over user preferences derived from population signals before any behavioral data exists. All of these signals must be expressible as graph relationships immediately, without a schema migration gate. Property graphs handle this without friction.

The counterpoint is real: schema flexibility accumulates semantic debt. Without an ontology, "genre" in one section of the graph and "category" in another may silently refer to the same concept — or not. Different teams using different relationship type names for equivalent semantics creates graph pollution that degrades traversal quality over time. The lack of a forced schema is a feature during rapid iteration that converts into a liability as the graph grows past a few hundred node and edge types. The answer is not to avoid property graphs — it is to maintain a lightweight vocabulary document and enforce naming conventions in code review.

The Performance Gap at p50 < 30 ms

Latency for graph-based recommendation is governed by three compounding factors: traversal depth, fan-out per hop, and cache hit rate. Both data models are affected, but property graphs have better native tooling for controlling all three.

Traversal depth. At 2 hops with a fan-out of 100 neighbors per node, a naive traversal visits 10,000 nodes. At 3 hops, 1,000,000. Both property graphs and RDF stores need early filtering to make this tractable. Cypher's pattern matching applies filters inline during traversal — WHERE r.quality = "completed" on a relationship prunes before expanding the next hop. SPARQL's optimizer can apply filter pushdown, but the query planner's decision is less predictable, and the verbosity of SPARQL makes it easy to write patterns that prevent the optimizer from pushing down correctly.

Fan-out and supernode handling. High-degree nodes — a viral track, a blockbuster film, a celebrity with millions of followers — create supernode problems in any graph database. Property graph stores have mature query-level tooling for supernode mitigation: relationship type filtering, edge property index pushdown, and explicit fan-out caps via LIMIT within MATCH clauses. The pattern:

MATCH (u:User)-[r:WATCHED {quality: "completed"}]->(m:Item)
WHERE r.watchedAt > $cutoff
WITH m LIMIT 50

…prunes on edge properties before the traversal fans out, and the LIMIT prevents supernode explosion. In SPARQL, achieving equivalent selectivity requires careful structuring of the WHERE clause ordering and relies more heavily on the query planner making the right index selection.

Cache and warm graph behavior. For recommendation workloads where a small fraction of items drive most traffic (a standard power-law distribution), the hot subgraph fits in memory. Neo4j's page cache is well-documented and predictable to configure. With a warm cache and a 3-hop pattern, p50 < 5 ms is routinely achievable in 2026 production deployments on commodity hardware. RDF stores with native index structures (Stardog, Oxigraph, Ontotext GraphDB) also benefit from warm caches, but the per-hop index overhead means the floor is higher — typically 15-40 ms for equivalent 3-hop patterns.

RDF-Star and GQL: The 2026 Convergence

The binary choice between property graphs and RDF is narrowing, but it has not collapsed.

RDF-star (now incorporated into the RDF 1.2 draft) allows a triple to be the subject or object of another triple, closing the largest ergonomic gap: edge properties are now first-class without reification. <<:user1 :watched :movie42>> :confidence 0.92 is a single statement. This was the primary practical objection to using RDF for behavioral signal graphs. With RDF-star, that objection is structurally resolved.

On the property graph side, ISO GQL (published 2024, now implemented in Amazon Neptune, SAP HANA Graph, and planned for Memgraph 3.0) adds named graphs and schema annotations, moving property graphs toward the structural expressiveness that was previously RDF's exclusive domain.

In practice: Amazon Neptune supports both openCypher and SPARQL over the same underlying graph. Stardog now offers a Cypher-compatible mode. The choice in 2026 is increasingly about query execution engine — traversal-optimized vs. inference-optimized — not about what features each model can express.

If your recommendation queries are primarily traversal-heavy (collaborative filtering, item-item similarity propagation, social graph proximity), you want a property graph execution engine. If your queries are primarily inference-heavy (class hierarchy traversal, entity resolution, OWL reasoning), you want an RDF/OWL execution engine. Most serious recommenders have both workloads.

The Layered Architecture That Ships Great Recommenders

The teams running knowledge graph recommenders at scale — Spotify's entity graph, LinkedIn's Economic Graph, Pinterest's interest taxonomy — use layered architectures. The pattern is consistent enough to treat as a reference design, not a coincidence.

The semantic layer (RDF/OWL). Defines the ontology: entity types, class hierarchies, cross-source identity mappings, inference rules. Updated in batch or near-real-time by enrichment pipelines. Powers entity resolution (merging Wikidata artists with your internal catalog), category inference (new content mapped to genre taxonomy without manual labeling), and cold-start bridging (inferring upstream interest paths from onboarding declarations via rdfs:subClassOf traversal). Never queried by the real-time recommendation endpoint. This layer runs once — or on an enrichment cadence — not on every request.

The operational layer (property graph). A materialized, denormalized view of the recommendation-relevant subgraph. Built from semantic layer output plus behavioral signals (plays, clicks, skips, shares, synthetic clone priors). Schema evolves freely as product experiments require new edge types. Optimized for multi-hop traversal at p50 < 30 ms. Queried directly by the recommendation service on every user request.

The key insight: the RDF ontology governs what the property graph contains, but the property graph governs how fast you retrieve it. Entity resolution, class hierarchy inference, and external knowledge integration happen in the semantic layer on a batch cadence. Real-time traversal happens in the property graph on a per-request cadence. The layers have different correctness requirements, different tooling, and different update frequencies.

This separation also cleanly partitions team responsibilities. Knowledge engineers own the ontology — its vocabulary, its alignment to external sources, its inference rules. Recommendation engineers own the operational graph — its schema, its query patterns, its latency budget. The interface between them is the materialization pipeline that translates semantic layer output into property graph writes.

A 2018 paper on ripple network propagation for knowledge graph recommenders (Wang et al., ArXiv:1803.03467) foreshadowed this layered approach: propagating preferences through a knowledge graph requires both a well-structured semantic hierarchy (what connects what) and an efficient traversal engine (how fast you can traverse it). Treating these as one problem is what leads teams to build an RDF store and wonder why their p99 is 200 ms.

Where to Start

If you're greenfield with no existing knowledge base: Deploy a property graph (Neo4j, Memgraph, or Amazon Neptune with openCypher). Model user-item interactions and content features as typed nodes and relationships. Nail the 3-hop traversal pattern for collaborative filtering with edge property filters. This produces a working recommendation system in 2-3 weeks with observable latency characteristics from day one.

If you need external knowledge integration in the near term: Add a Wikidata enrichment pipeline that queries the SPARQL endpoint for entity metadata, then writes the enriched properties and concept edges into your property graph as a batch job. You get RDF knowledge without running an RDF store at query time. This is the lowest-cost path to semantic enrichment.

If you're hitting cold-start failure with no behavioral data and have a content taxonomy: This is when an OWL or SKOS ontology earns its maintenance cost. Model your genre/category/topic hierarchy using skos:broader / skos:narrower relationships, run a reasoner (Apache Jena TDB2 or Oxigraph for lightweight deployments, Stardog for larger-scale inference) to materialize subclass memberships, then write the results as property graph edges. Run the reasoner offline on an enrichment cadence — never in the real-time request path.

If you're integrating multiple content domains or external catalogs: Invest in the full layered architecture. The semantic layer handles entity resolution across sources — owl:sameAs assertions linking your internal IDs to Wikidata, MusicBrainz, and schema.org entities — so the operational property graph presents a clean, resolved view. The investment pays for itself when you add a new content domain and the ontology handles classification automatically instead of requiring manual labeling.

The choice between property graphs and RDF is not an ideology. It is a latency budget question and a semantic complexity question. Property graphs own the p50 latency benchmark. RDF owns the ontological inference benchmark. If only one of those is binding for your team this quarter, the choice is obvious. If both are binding — which is usually true once the product has multiple content domains and a real cold-start problem — the answer is a layer boundary, not a winner.

the product behind these notes

×marble is the personalization graph.

One API. A living knowledge graph per user. Day-zero ready, explainable by construction. We built it so you don't have to.

See ×marble