← Back to Datasets

LDBC SNB Dataset

Benchmarking graph database systems on a synthetic social network at billion-edge scale

Dataset Overview

The LDBC Social Network Benchmark (SNB) is the reference benchmark of the Linked Data Benchmark Council for graph data management systems. Unlike the other datasets in PropGBench, which are real-world data, SNB is generated: its data generator simulates a Facebook-style social network over a fixed timeline, so the graph can be produced at any scale factor while keeping its structural properties — a power-law degree distribution, realistic clustering, and correlations between where people live, what they are interested in, and whom they know. PropGBench uses the Business Intelligence (BI) workload at scale factor 100. More

The graph has two halves. The static part is real-world reference data scraped from DBpedia — 1,460 places, 7,955 universities and companies, and a 16,080-tag hierarchy — and never changes. The dynamic part is the simulated social activity: people registering, befriending each other, joining forums, and posting and replying. Every dynamic entity carries a creationDate, and the generator emits a continuous timeline that is cut at one instant. Everything before the cut is the initial snapshot; everything after it is delivered as separate insert and delete streams.

PropGBench loads only the initial snapshot, whose latest creationDate is 2012-11-29T02:52:42.849+00:00. The insert and delete streams that ship with the dataset are not applied, because the BI queries measured here are read-only. The graph under test is therefore a fixed, reproducible snapshot rather than a moving target.

Total node count: 254,634,696

Total edge count: 1,703,042,944

Dataset Download

LDBC publishes pre-generated data sets, so the generator does not need to be run. PropGBench uses scale factor 100 in the composite-projected-fk serialisation, in which every entity and every relationship is its own directory of pipe-delimited CSV shards. The download is 29.3 GiB compressed and expands to roughly 115 GB.

The archive is Zstandard-compressed and can be decompressed while it downloads, which avoids ever storing the compressed copy:

bash
curl --silent --fail https://datasets.ldbcouncil.org/bi-pre-audit/bi-sf100-composite-projected-fk.tar.zst \
  | tar -xv --use-compress-program=unzstd

Two things about the CSV files are worth knowing before loading them. They carry no header row — the column definitions live in a separate tree of header files, which the reference implementations provide per system. And some of the generator's output shards are legitimately empty, so a loader must tolerate empty files rather than treat them as an error.

The query parameters are generated per scale factor and are not interchangeable between scale factors. For SF100, note that the 15a and 20a parameter files are empty and 15b holds only four parameter sets, so Q15 has far fewer runs available than the other queries.

Benchmark Workloads

Select a platform below to view the specific data loading commands and queries used to benchmark performance.

A PuppyGraph implementation for this dataset is not available yet.

The BI workload defines 20 queries. Three of them (Q15, Q19, Q20) are weighted shortest-path queries whose edge weights are derived from interaction history, and one (Q10) isolates the ring of people at a given friendship distance, so systems without a graph-algorithm library or recursive traversal need their own implementations of these four.

Runtime Results

* The unit of all results shown below are in milliseconds (ms): the client-side wall-clock time of one run. Neo4j ran with a two-hour limit per query; TigerGraph and GraphFrames ran with a one-hour limit, and no query reached it. — means not measured yet.

* MEMORY_LIMIT means the query ran out of memory (Neo4j heap of 10 GiB, a TigerGraph node falling below its critical free-memory level, or a Spark executor/driver out of memory); TIMEOUT means the query ran for more than two hours without finishing; NOT SUPPORTED means the database platform does not support certain features required by the query; POOL LIMIT means the intermediate results generated by the query exceeded the engine-configured memory pool limit (Neo4j’s 8 GiB transaction memory pool); FAILED means the system reported another error.

* Neo4j: all 41 queries have been run. Q10–Q12, Q20, Q22 and Q27–Q41 were run with a two-hour limit per query; the others finished within the earlier one-hour limit. The GDS graph projections of Q11, Q12 and Q27–Q31 are built before the query and not timed; Q11’s projection did not finish within its 20-minute limit and Q12’s exceeded the transaction memory pool, so neither query could run.

* GraphFrames: all 41 queries have been run. Q30 is not supported: GraphFrames’ only strongly connected components implementation (GraphX) cannot process the directed KNOWS graph, a deep acyclic graph; Q31 runs Label Propagation in place of Louvain, which GraphFrames does not provide.

* TigerGraph: all 41 queries have been run on the six-node cluster, which also keeps the other graphs loaded in memory.

* PuppyGraph: query runs are pending.

Date (Instance) PuppyGraph Neo4j TigerGraph GraphFrames
Q1 — 1,979 279 53,281
Q2 — 42,964 1,238 39,406
Q3 — 4,499 1,288 28,244
Q4 — 15,756 688 21,196
Q5 — 2,574 32 658
Q6 — 2,728 448 4,843
Q7 — 3,397 683 43,761
Q8 — 2,027 1,145 48,564
Q9 — 58,019 1,098 28,591
Q10 — POOL LIMIT 11,907 571,199
Q11 — TIMEOUT 145,927 254,229
Q12 — POOL LIMIT 613 24,487
Q13 — 276,142 1,539 178,414
Q14 — 2,313 996 24,709
Q15 — 283,733 770 24,839
Q16 — 2,733 713 47,009
Q17 — 59,389 2,055 32,055
Q18 — 2,572,080 7,229 87,486
Q19 — 295,759 930 38,232
Q20 — TIMEOUT 10,539 57,307
Q21 — 92,173 1,013 46,490
Q22 — TIMEOUT 5,475 78,213
Q23 — 4,958 276 5,226
Q24 — 4,740 385 5,085
Q25 — 56,787 1,039 32,601
Q26 — 2,313 458 7,379
Q27 — 4,650 425 6,471
Q28 — POOL LIMIT 26,073 293,597
Q29 — 2,141 6,399 54,391
Q30 — 2,905 2,873,051 NOT SUPPORTED
Q31 — 53,635 43,796 221,028
Q32 — TIMEOUT 18,104 85,577
Q33 — 710,546 418 4,500
Q34 — 165,423 1,682 70,890
Q35 — POOL LIMIT 11,647 133,287
Q36 — TIMEOUT 6,439 68,157
Q37 — TIMEOUT 1,247 39,440
Q38 — 2,762,351 3,648 130,834
Q39 — TIMEOUT 14,316 53,115
Q40 — POOL LIMIT 1,921 46,643
Q41 — POOL LIMIT 3,079 120,308

Memory Results

* The unit of all memory results shown below is megabytes (MB, 106 bytes). Each platform reports a different kind of peak, so the columns show where a query is heavy within one platform and should not be compared across platforms.

* Neo4j: the query’s peak memory from PROFILE (operator memory, not the JVM heap or page cache). It does not include the GDS graph projection that Q27–Q31 read: 114.5 MB for the undirected KNOWS graph and 77.6 MB for the directed one used by Q30.

* TigerGraph: the sum over the six GPEs of each GPE’s peak vertex-accumulator memory for the whole query, from the query profile. The peaks need not occur at the same time, and the value is not process memory.

* GraphFrames: the largest peak execution memory of a single Spark task of the query; not the executors’ total or process memory.

* Failed queries show the same status as in the runtime table.

Date (Instance) PuppyGraph Neo4j TigerGraph GraphFrames
Q1 — 0.005 0.000 202.442
Q2 — 98.121 12.000 603.980
Q3 — 178.152 50.000 603.980
Q4 — 6.699 0.000 603.980
Q5 — 0.954 0.000 0.000
Q6 — 0.032 0.000 167.772
Q7 — 0.005 0.000 218.138
Q8 — 0.038 1.000 218.138
Q9 — 0.041 0.000 402.653
Q10 — POOL LIMIT 2,725.000 536.871
Q11 — TIMEOUT 25,296.000 536.871
Q12 — POOL LIMIT 76.000 405.406
Q13 — 678.764 9.000 421.922
Q14 — 2.660 0.000 402.653
Q15 — 3,747.566 111.000 603.980
Q16 — 0.066 0.000 402.653
Q17 — 2,645.529 70.000 402.653
Q18 — 42.841 5,761.000 536.871
Q19 — 14.626 17.000 664.109
Q20 — TIMEOUT 13,292.000 778.731
Q21 — 9.935 8.000 805.306
Q22 — TIMEOUT 783.000 536.871
Q23 — 0.000 0.000 151.257
Q24 — 6.254 0.000 285.999
Q25 — 12.248 94.000 603.980
Q26 — 2.374 0.000 407.275
Q27 — 0.197 16.000 202.899
Q28 — POOL LIMIT 225.000 939.524
Q29 — 2.398 254.000 402.653
Q30 — 57.603 10,360.000 NOT SUPPORTED
Q31 — 2.401 672.000 939.524
Q32 — TIMEOUT 2,695.000 603.980
Q33 — 0.020 64.000 67.404
Q34 — 0.033 4.000 268.435
Q35 — POOL LIMIT 1,310.000 1,611.137
Q36 — TIMEOUT 3,005.000 536.871
Q37 — TIMEOUT 38.000 536.871
Q38 — 70.932 245.000 939.524
Q39 — TIMEOUT 18.000 536.871
Q40 — POOL LIMIT 8.000 536.871
Q41 — POOL LIMIT 7.000 603.980

Loading the SF100 snapshot into Neo4j Enterprise 2026.05.0 with neo4j-admin database import full took 3,967 seconds (1h 6m 7s) and produced a 201 GB store, with all uniqueness constraints and secondary indices built during the import.

Loading the same snapshot into TigerGraph Enterprise 4.2.4, on a six-node cluster, took 1,061.5 seconds (17m 42s): 1,011.7 seconds for the four loading jobs, 13.9 seconds to merge the loaded deltas and 36.0 seconds to build the secondary indices.

For GraphFrames, Spark read the same CSV files and wrote one Delta table per node and edge type to HDFS in 379.0 seconds (6m 19s), producing 41.9 GB of Delta tables (125.6 GB on HDFS with 3-way replication). The graph itself is built from those tables when a query runs.

Every node and relationship count matches across the three loads. The three figures are not a like-for-like comparison: Neo4j ran on a single machine, while TigerGraph and Spark each used six worker nodes.