2016-09-23 33 views
0

我想加载500000个节点,但查询不能成功执行。可以告诉我neo4j社区版数据库中节点数量的限制吗?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 
""") 
+0

你正在执行什么查询?可能有助于编辑您的问题以显示它。 AFAIK没有节点限制(即使使用旧版本,社区和企业之间的节点限制也没有差异)。 –

回答

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倍,我肯定创造了10万个节点:

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

你的问题是最有可能与事务大小有关:如果它太大,可能会导致出现OutOfMemory错误,并且在此之前可能会由于所有垃圾收集而使实例减慢抓取速度。以较小批次拆分节点创建,例如如果您使用LOAD CSV,则使用USING PERIODIC COMMIT


更新:

您的查询已经包括USING PERIODIC COMMIT并且仅创建2个节点,每个CSV文件中第1间的关系,所以最有可能与查询本身比的性能做交易的大小。

您有2个特性与来自CSV(acSTART)相同的值设置Start节点,并且节点End也与2处相同的值(enEND)来设置。用于MERGE的属性是否存在唯一性约束?没有它,随着节点的创建,处理每条线需要的时间越来越长,因为它需要使用所需的标签扫描所有现有的节点(对于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节点之间当前信用关系的快照(在这种情况下,每对有一对关系),或者它包含所有事务,并且没有真正的理由将这些事务合并为相同数量。

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

+0

嗨,我正在运行这些查询,结果= session.run(“”“ 使用定期提交10000 加载CSV与标头”file:///关系。csv“AS row merge on(s:Start {ac:row.START})on create set s.START = row.START merge(e:End {en:row.END})on create set.END = row .END FOREACH(_在CASE row.TYPE当“PAID”then [1] else [] end | MERGE(s) - [:PAID {cr:row.CREDIT}] - >(e)) FOREACH(_在CASE row.TYPE WHEN“UNPAID”时,则[1] else [] end | MERGE(s) - [:UNPAID {db:row.DEBIT}] - >(e)) RETURN s.START as index,count( e)按连接顺序排序desc “”“) –

+0

您应该将其编辑到问题本身中。 –

相关问题