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:
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.