我有一个Neo4J数据库,其中包含大约90K节点(使用py2neo插入并从twitter收集)。我想在所有这些节点对之间创建关系,并在Node上的关系上初始化特定值。我在python中使用py2neo进行此操作,并尝试比较所有两个节点并创建该关系,但这需要花费太多时间,例如创建80K关系需要2个多小时。
有没有更好的方法来创建这种花费更少时间的关系? py2neo是慢还是因为数据量?
提前致谢
答案 0 :(得分:4)
您正在尝试进行大约81亿(90K * 90K)的操作。如果每个操作需要1毫秒(仅供讨论 - 可能会有所帮助),那么将需要将近94天。
所以,你想避免使用笛卡尔产品"复杂度为O(N ** 2)。我建议您重新访问您的用例,了解如何调整neo4j数据模型,以避免创建如此多的操作和关系。
[UPDATE]
如果你真的不需要在所有节点对之间建立关系,但只需要在特定节点对之间建立关系,那么来自@MichaelHunger的评论建议一种方法具有大约O(N)
复杂度。
该方法要求您首先创建索引;例如,如果您的节点具有标签Foo
,并且用于确定是否创建关系的感兴趣的属性是bar
:
CREATE INDEX ON :Foo(bar)
然后,你可以:
MATCH
所有Foo
个节点。Foo
节点,使用索引查找具有相应Foo
值的所有其他bar
节点(例如,其bar
是当前{的两倍{ {1}})。在当前节点和另一个节点之间创建关系。
bar
第1步的复杂度为MATCH (n:Foo)
MATCH (other:Foo) USING INDEX other:Foo(bar)
WHERE other.bar = n.bar * 2
CREATE (n)-[:RELATED_TO]->(m);
,后续步骤的复杂度为O(N)
,导致整体复杂度为O(1)
。