Neo4j Cypher:查找/合并具有至少 2 个公共节点的节点

Posted

技术标签:

【中文标题】Neo4j Cypher:查找/合并具有至少 2 个公共节点的节点【英文标题】:Neo4j Cypher: Find/Merge nodes having atleast 2 common nodes 【发布时间】:2021-12-27 02:53:48 【问题描述】:

我是 Graph DB 和 Neo4j 的新手,需要帮助来查询具有至少 2 个公共节点的数据

Graph

从上图中,我需要获取 ROW1 和 ROW2 的详细信息,因为它是 2 个公共节点 ID_B 和 ID_C

Graph 2 with more nodes having common neighbor

使用图 2,我需要 Row1 、 Row2 和 Row3 的合并细节作为 Row1 & Row2 共有 ID_B、ID_C Row2 & Row3 有共同的 ID_A ,ID_B C

【问题讨论】:

【参考方案1】:

这个怎么样。

MATCH(r1:ROW)-[h1:HAS_ID]->(i1:ID)-[p1:PART_OF]->(r1)
MATCH(r2:ROW)-[h2:HAS_ID]->(i2:ID)-[p2:PART_OF]->(r2)
WHERE r1.ID <> r2.ID and i1.ID <> i2.ID
WITH r1, r2, COLLECT(i1) AS i1c, COLLECT(i2) AS i2c
WHERE SIZE(i1c) > 1 AND SIZE(i2c) > 1 AND SIZE(apoc.coll.intersection(i1c, i2c)) > 1
RETURN DISTINCT r1 AS row1, r2 AS row2, apoc.coll.intersection(i1c, i2c) AS ids

【讨论】:

感谢您的询问。它适用于 2 条记录。我正在工作的图表可以有更多具有公共节点(邻居)的节点。我基本上想将所有具有至少 2 个公共节点(邻居)的节点分组。向我的原始问题添加了一个新图表,其中包含更多节点和关系 @Graphileon 的第二个答案是最好的。【参考方案2】:

我认为这样做可以:

MATCH(r1:ROW)-[:HAS_ID]->(i)<-[:HAS_ID]-(r2:ROW)
WHERE id(r1) > id(r2)
WITH r1,r2, COLLECT(i) AS is
WHERE SIZE(is) > 1
RETURN r1,r2

如果您有多个记录并希望查询返回具有两个或多个共同点的唯一记录列表,您可以这样做:

MATCH(r1:ROW)-[:HAS_ID]->(i)<-[:HAS_ID]-(r2:ROW)
WHERE id(r1) > id(r2)
WITH [r1,r2] AS nodePair, COLLECT(i) AS is
WHERE SIZE(is) > 1
UNWIND nodePair AS node
RETURN DISTINCT node

【讨论】:

这个查询也适用于我。您能否告诉我是否必须查询具有至少 2 个共同邻居的所有节点并将它们组合在一起。我已经编辑了我的原始帖子,其中包含更多节点的图表以及我正在寻找的结果 扩展答案

以上是关于Neo4j Cypher:查找/合并具有至少 2 个公共节点的节点的主要内容,如果未能解决你的问题,请参考以下文章

使用 Cypher 从 Neo4j 图中提取子图

CYPHER 语句(Neo4j)

如何优化Neo4J Cypher查询?

Neo4j效率问题:Cypher查询永远运行

Neo4j 第十一篇:Cypher函数

cypher neo4j - 收集一组节点