当前位置: 首页 > 知识库问答 >
问题:

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

岳华灿
2023-03-14

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

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

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

但是如果我有大约200K的节点,这个脚本运行的时间相当长。

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

谢谢

共有1个答案

丌官炎彬
2023-03-14

您编写的查询首先在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)

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

 类似资料:
  • 我正在创建一个简单的社交图,用户可以在其中创建一个帖子,标记它,并对它进行评论。我用py2neo做模型。该模型具有和作为节点。用户在上、或。在我的例子中,单个用户可以在单个上创建多个或(就像其他任何社交网络一样)。根据我的模型,这需要多个或关系,但具有不同的属性。模型是这样建立的: 我运行以下操作来构建图形: 我希望有两个关系,如下所示: 但我看到事实并非如此: 那么,我的问题是双重的。(1)可以

  • 我有以下图表: 我正在寻找一种方法来计算从a发送到b和从b发送到c/d的金额之间的差异,这取决于referenceId,但不使用特定的referenceId。 所以我在寻找像下面这样的半代码: 有人知道我该怎么做吗?

  • 从Neo4j 1.9开始。2,并使用Cypher查询语言,我希望在具有特定公共属性值的节点之间创建关系。我有一组具有属性H的节点G,在G节点之间当前不存在任何关系。 在Cypher语句中,是否可以按H属性值对G节点进行分组,并在成为同一组的每个节点之间创建关系HR?知道每个小组的人数在2人之间 我一直在努力管理这样的查询,但没有找到正确的语法。下面是一个小样本数据集: 最后,我希望有这样的关系:

  • 人员节点: 名字 姓氏 地址 电子邮件 电话号码 公司节点: 姓名 地址 电子邮件 电话号码 关系: 个人-[配偶]- 个人和实体: 当我为简创建一个人时,我也添加了与约翰的兄弟姐妹关系。 运行检索节点Jane和对应的同级节点John。 但是,手足关系应该是双向的。运行仅检索节点John。 这就是问题所在。我可以在约翰和简之间添加另一种兄弟姐妹关系。但是,这实际上在两者之间创建了一个无限循环。以及

  • 我现在的解决办法是先保存所有的ArchitectureUnitState节点,从数据库中再次检索它们,将一个节点映射到另一个节点,然后再次保存它。这样,可以创建关系,但我需要保存两次。

  • 花了好几天的时间试图弄明白为什么这不起作用。我的模型是