如何在neo4j中获取所有连接的节点

Posted

技术标签:

【中文标题】如何在neo4j中获取所有连接的节点【英文标题】:How to get all connected nodes in neo4j 【发布时间】:2017-12-15 09:10:51 【问题描述】:

我想获取从节点 0 开始的所有连接节点的列表,如图所示

【问题讨论】:

你能再精确一点吗?你想要什么结果? 我想获取所有连接节点的列表。例如,在上述情况下,当我搜索 0 的连接节点时,它应该返回节点 - 1,2,3。 【参考方案1】:

根据您的评论:

我想获取所有已连接节点的列表。例如在 在上述情况下,当我搜索连接的节点为 0 时,它应该返回 节点 - 1,2,3

这个查询会做你想做的事:

MATCH (id : 0)-[*]-(connected)
RETURN connected

上述查询将返回与id=0 的节点连接的所有节点(我认为节点内的数字是 id 属性的值)在任何深度、两个方向并考虑任何关系类型。查看文档的Relationships in depth 部分。

虽然这对于小图可以正常工作,但请注意这是一项非常昂贵的操作。考虑到任何关系类型,它将从起点(id : 0) 遍历整个图表开始。这对于生产环境来说确实不是一个好主意。

【讨论】:

在循环图的情况下,它给出了重复的节点 @chetandev 尝试:MATCH (root id : 0)-[*]-(connected) WHERE root <> connected RETURN distinct connected【参考方案2】:

如果你想匹配与另一个节点有关系的节点,你可以使用这个:

MATCH (n) MATCH (n)-[r]-() RETURN n,r

它将返回与另一个或多个节点有关系的所有节点,无论关系的方向如何。

如果你想添加一个约束,你可以这样做:

MATCH (n:Label id:"id") MATCH (n)-[r]-() RETURN n,r

【讨论】:

我可以做些什么来获得一个深层节点,即不仅仅是直接连接到 n 的节点 MATCH (n:Label id:"id") MATCH(q:Deep_Node id:"id") MATCH (n)-[r]-(q) 返回 n,r ,q【参考方案3】:

对于更大或更紧密互连的图,APOC Procedures 提供了一种更有效的遍历方式,可返回子图中的所有节点。

正如其他人已经提到的,最好在节点上使用标签,并在标签+属性上添加索引或唯一约束,以便快速查找起始节点。

使用“Label”标签和idParam 参数,使用APOC 获取子图节点的查询将是:

MATCH (n:Label id:$idParam)
CALL apoc.path.subgraphNodes(n, minLevel:1) YIELD node
RETURN node

节点将是不同的,起始节点不会与其余节点一起返回。

编辑

目前有一个限制,禁止在subgraphNodes() 中使用minLevel,您可以自己过滤掉起始节点,也可以使用apoc.path.expandConfig()uniqueness:'NODE_GLOBAL' 来获得相同的效果。

【讨论】:

以上是关于如何在neo4j中获取所有连接的节点的主要内容,如果未能解决你的问题,请参考以下文章

Neo4j:如何找到具有相互连接节点的连接节点?

如何从 Neo4j Graph 中获取每个节点的不同中心性索引?

我如何基于Neo4j中的子节点链接创建节点之间的链接

Neo4j cypher查询获取起始节点和结束节点之间的所有节点

如何使用Spring Boot获取节点链(Neo4j)

c语言中如何获取树中所有叶子节点的路径