在neo4j中创造太多关系需要太多

时间:2016-01-10 21:34:51

标签: python neo4j py2neo

我有一个Neo4J数据库,其中包含大约90K节点(使用py2neo插入并从twitter收集)。我想在所有这些节点对之间创建关系,并在Node上的关系上初始化特定值。我在python中使用py2neo进行此操作,并尝试比较所有两个节点并创建该关系,但这需要花费太多时间,例如创建80K关系需要2个多小时。

有没有更好的方法来创建这种花费更少时间的关系? py2neo是慢还是因为数据量?

提前致谢

1 个答案:

答案 0 :(得分:4)

您正在尝试进行大约81亿(90K * 90K)的操作。如果每个操作需要1毫秒(仅供讨论 - 可能会有所帮助),那么将需要将近94天。

所以,你想避免使用笛卡尔产品"复杂度为O(N ** 2)。我建议您重新访问您的用例,了解如何调整neo4j数据模型,以避免创建如此多的操作和关系。

[UPDATE]

如果你真的不需要在所有节点对之间建立关系,但只需要在特定节点对之间建立关系,那么来自@MichaelHunger的评论建议一种方法具有大约O(N)复杂度。

该方法要求您首先创建索引;例如,如果您的节点具有标签Foo,并且用于确定是否创建关系的感兴趣的属性是bar

CREATE INDEX ON :Foo(bar)

然后,你可以:

  1. MATCH所有Foo个节点。
  2. 对于每个匹配的Foo节点,使用索引查找具有相应Foo值的所有其他bar节点(例如,其bar是当前{的两倍{ {1}})。
  3. 在当前节点和另一个节点之间创建关系。

    bar
  4. 第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)