在整个数据库上运行Cypher查询

时间:2014-01-06 22:02:39

标签: neo4j cypher

我有一组2种类型的实体,即作者和参考,它们是从A - > R连接起来的' Authored'类型。有人帮我提出了这段代码来添加一组新的关系

match (a)-[r]->(b)<-[r2]-(c)
merge (a)-[new:CoAuthor]->(c)
on create set new.weight=1
on match set new.weight=new.weight+1

但是,我的内存不足。我尝试使用以下代码限制执行的次数:

start a=node(1)
match (a)-[r:Authored]->(b)<-[r2:Authored]-(c)
with a
limit 10
match (b)<-[r2]-(c)
create (a)-[new:CoAuthor]->(c);

但即使最大内存设置为3072米,仍然没有运气。有没有办法迭代整个数据库并在后台分阶段完成?我不能一次手动完成这10个节点b / c我有600k作者和1.5m参考和他们之间7m的关系。

这将是一次性写入,因为这不是事务性数据库。目的是创建这些链接以支持我稍后需要做的实际查询。我还需要在db中放入其他实体,并且希望我能找到一种有效的方法来实现这一点。

1 个答案:

答案 0 :(得分:2)

尝试这个(继续运行,直到你从计数中得到0;如果1000足够快,可能会尝试增加到10000):

match (a)-[r:Authored]->(b)<-[r2:Authored]-(c)
where NOT (a)-[:CoAuthor]-(c)
with a, c
limit 1000
create unique (a)-[new:CoAuthor]-(c)
return count(*)

然后,如果你想计算他们一起工作的书籍数量,我会在后续查询中做到这一点。目前很难建立独特的无向关系。

match (a)-[r:CoAuthor]-(b)
with length((a)-[:Authored]->()<-[:Authored]-(b)) as count, r
set r.weight=count

如果您有大量数据,也可能需要一些批处理,但试一试。