在具有相同属性的节点之间创建关系

时间:2016-09-29 08:27:46

标签: neo4j cypher

我需要在所有节点之间创建具有相同属性值的关系。

例如,我可以使用以下查询:

O(N)

但如果我有大约200k的节点,这个脚本运行的时间很长。

还有其他更快捷的方式来创建这种关系吗?

由于

1 个答案:

答案 0 :(得分:2)

您首先编写的查询在所有人员节点配对之间创建了一个笛卡尔积,然后对每个配对进行过滤以找到实际相关的那些,然后创建关系。这是非常昂贵的,n ^ 2操作。

相反,您可能只需要遍历所有Person节点,并找到具有该属性的相应人员节点,并创建关系。

此外,如果您对相关属性有索引或唯一约束,您应该会看到性能大大提高,否则它将是每个比较对该标签中所有节点的节点扫描,这是慢查询的另一个因素

另外,我鼓励你尽可能不返回节点和关系,假设它在数千或数十万个结果附近。这可能是另一个因素。

match (p1:Person)
with p1
match (p2:Person)
where p2.someproperty = p1.someproperty and p1 <> p2
merge(p1)-[r:Relationship]-(p2)

你应该能够解析这个查询和旧查询,看看它们是如何运行的。