neo4j社区版在数据存储方面的限制是什么(即记录数量)?

时间:2016-09-23 11:37:04

标签: neo4j

我正在尝试加载500000个节点,但是查询没有成功执行。任何人都可以告诉我neo4j社区版数据库中节点数量的限制吗?

我正在运行这些查询

result = session.run("""
    USING PERIODIC COMMIT 10000
    LOAD CSV WITH HEADERS FROM "file:///relationships.csv" AS row
    merge (s:Start {ac:row.START})
    on create set s.START=row.START
    merge (e:End {en:row.END})
    on create set s.END=row.END
    FOREACH (_ in CASE row.TYPE WHEN "PAID" then [1] else [] end |
        MERGE (s)-[:PAID {cr:row.CREDIT}]->(e))
    FOREACH (_ in CASE row.TYPE WHEN "UNPAID" then [1] else [] end |
        MERGE (s)-[:UNPAID {db:row.DEBIT}]->(e))
    RETURN s.START as index, count(e) as connections
    order by connections desc
""")

1 个答案:

答案 0 :(得分:2)

我不认为社区版本在这方面比企业版更受限制,而且大多数限制都是removed in 3.0

无论如何,我可以轻松创建一百万个节点(在一次交易中):

neo4j-sh (?)$ unwind range(1, 1000000) as i create (n:Node) return count(n);
+----------+
| count(n) |
+----------+
| 1000000  |
+----------+
1 row
Nodes created: 1000000
Labels added: 1000000
3495 ms

运行10次,我肯定创造了1000万个节点:

neo4j-sh (?)$ match (n) return count(n);
+----------+
| count(n) |
+----------+
| 10000000 |
+----------+
1 row
3 ms

您的问题很可能与事务的大小有关:如果它太大,则可能导致OutOfMemory错误,在此之前,由于所有垃圾回收,它可能会使实例变慢。以较小的批次拆分节点创建,例如如果您使用USING PERIODIC COMMIT,请使用LOAD CSV

<强>更新

您的查询已包含USING PERIODIC COMMIT,并且仅从CSV文件中每行创建2个节点和1个关系,因此它很可能与查询本身的性能有关,而不是与事务的大小有关。

您有Start个节点,其中2个属性设置为CSV(acSTART)中的相同值,End个节点也设置了2个属性相同的值(enEND)。对于MERGE使用的属性是否存在单一性约束?没有它,在创建节点时,处理每一行将花费更长时间,因为它需要使用所需标签扫描所有现有节点( O(n ^ 2)算法,这是非常糟糕的对于500K节点)。

CREATE CONSTRAINT ON (n:Start) ASSERT n.ac IS UNIQUE;
CREATE CONSTRAINT ON (n:End) ASSERT n.en IS UNIQUE;

这可能是适用的主要改进。

但是,你真的需要MERGE关系(而不是CREATE)吗? CSV包含所有StartEnd节点之间当前信用关系的快照(在这种情况下,每对有一个关系),或者它包含所有事务,并且没有真正的理由来合并这些相同金额。

最后,您是否真的需要报告该加载查询的已排序聚合结果?它需要更多内存,并且可以在加载成功后拆分为单独的查询。