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

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

【问题讨论】:

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

标签: neo4j cypher graph-databases


【解决方案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' 来获得相同的效果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多