使用 Cypher 从 Neo4j 图中提取子图

Posted

技术标签:

【中文标题】使用 Cypher 从 Neo4j 图中提取子图【英文标题】:Extract subgraph from Neo4j graph with Cypher 【发布时间】:2015-04-10 23:02:50 【问题描述】:

假设我在 Neo4j 中有一个包含 5 个节点的集合,这样集合中的每个节点都连接到集合中的至少一个其他节点。我想从 Neo4j 中提取由节点集合及其交互形成的子图。目前,我正在使用一种非常原始的方法,该方法涉及尝试从系统中的每个节点到其他每个节点的匹配项:

MATCH p=(n)-[]->(m)
WHERE id(n) IN [3,4,5,6,7] AND id(m) IN [3,4,5,6,7]
RETURN relationships(p);

但是,这个查询既多余又低效;它必须遍历集合中节点的每个排列(例如,它将匹配节点 #3 和 #4,以及 #4 和 #3)。有没有更有效的方法来获取这些节点仅使用 Cypher(无 Java)形成的子图?

这是我所说的“子图”的一个例子:

我希望 Cypher 返回所有标记为绿色的关系。请注意,集合中的节点不必与图的其余部分隔离;他们仍然可以与图中的其他节点建立关系,但我希望 Cypher 只返回绿色的关系。

【问题讨论】:

【参考方案1】:

我想扩展 Richards 的答案,您也可以将其限制为 id 位于不同组中的节点。

MATCH (n) WHERE id(n) IN [3,4,5,6,7]
MATCH p=(n)-->(m) 
WHERE id(n) < id(m) AND id(m) IN [3,4,5,6,7]
RETURN relationships(p);

结果

【讨论】:

不错的答案。 7和4之间的关系不会丢失吗?我的意思是在表格结果中,而不是在浏览器的可视化中。 嘿迈克尔,这是目前从 Neo4j 获取子图的最有效方法吗?或者是否有另一种方法可以在不有效尝试每个节点组合的情况下做到这一点?我只是担心这对于大约 50-100 个节点的东西可能无法正常工作。【参考方案2】:

查询的这种修改有助于数组的冗余。

WITH [3,4,5,6,7] AS arr
MATCH p=(n)-[]->(m)
WHERE id(n) IN arr AND id(m) IN arr
RETURN relationships(p);

您可以使用节点标签或关系类型进行区分(最终子图)和高效查询,但这取决于您的情况。

【讨论】:

除非我弄错了,这个查询只是稍微改进了语法。它对性能有任何帮助吗? @ShreyGupta:你没有弄错,它只是改进了语法。仅当查询保存在脚本中并且查询更复杂时才会有所帮助。然后你就可以在一个地方编辑脚本了。

以上是关于使用 Cypher 从 Neo4j 图中提取子图的主要内容,如果未能解决你的问题,请参考以下文章

如何忽略 cypher (neo4j) 中 java 存储过程的产量值?

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

知识图谱Neo4j Cypher查询语言详解

Neo4j/Cypher 测试数据请求

如何在neo4j Cypher中获取列表的子集

Neo4j 使用cypher语言进行查询