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

Neo4j 在具有相同属性的节点之间创建关系,neo4j,cypher,Neo4j,Cypher,我需要在所有具有相同属性值的节点之间创建关系 例如,我可以使用以下查询: match (p1:Person), (p2:Person) where p1 <> p2 and p1.someproperty = p2.someproperty merge(p1)-[r:Relationship]-(p2) return p1,r, p2 匹配(p1:个人),(p2:个人) 其中p1 p2和p1.someproperty=p2.someproperty 合并(p1)-[r:关系]-(p

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

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

match (p1:Person), (p2:Person)
where p1 <> p2 and p1.someproperty = p2.someproperty
merge(p1)-[r:Relationship]-(p2)
return p1,r, p2
匹配(p1:个人),(p2:个人)
其中p1 p2和p1.someproperty=p2.someproperty
合并(p1)-[r:关系]-(p2)
返回p1、r、p2
但是如果我有大约200000个节点,这个脚本运行的时间相当长

有没有其他更快的方法来建立这种关系


谢谢

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

相反,您可能希望只遍历所有Person节点一次,找到具有该属性的对应Person节点,并创建关系

此外,如果您对所讨论的属性具有索引或唯一约束,您应该会看到性能大大提高,否则每次比较都会对该标签中的所有节点进行节点扫描,这是导致查询速度缓慢的另一个因素

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

match (p1:Person)
with p1
match (p2:Person)
where p2.someproperty = p1.someproperty and p1 <> p2
merge(p1)-[r:Relationship]-(p2)
匹配(p1:个人)
与p1
匹配(p2:个人)
其中p2.someproperty=p1.someproperty和p1 p2
合并(p1)-[r:关系]-(p2)

您应该能够解释此查询和旧查询,并了解它们将如何运行。

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

相反,您可能希望只遍历所有Person节点一次,找到具有该属性的对应Person节点,并创建关系

此外,如果您对所讨论的属性具有索引或唯一约束,您应该会看到性能大大提高,否则每次比较都会对该标签中的所有节点进行节点扫描,这是导致查询速度缓慢的另一个因素

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

match (p1:Person)
with p1
match (p2:Person)
where p2.someproperty = p1.someproperty and p1 <> p2
merge(p1)-[r:Relationship]-(p2)
匹配(p1:个人)
与p1
匹配(p2:个人)
其中p2.someproperty=p1.someproperty和p1 p2
合并(p1)-[r:关系]-(p2)
您应该能够解释此查询和旧查询,并了解它们将如何运行