【发布时间】:2017-12-15 09:10:51
【问题描述】:
【问题讨论】:
-
你能再精确一点吗?你想要什么结果?
-
我想获取所有连接节点的列表。例如,在上述情况下,当我搜索 0 的连接节点时,它应该返回节点 - 1,2,3。
标签: neo4j cypher graph-databases
【问题讨论】:
标签: neo4j cypher graph-databases
根据您的评论:
我想获取所有已连接节点的列表。例如在 在上述情况下,当我搜索连接的节点为 0 时,它应该返回 节点 - 1,2,3
这个查询会做你想做的事:
MATCH ({id : 0})-[*]-(connected)
RETURN connected
上述查询将返回与id=0 的节点连接的所有节点(我认为节点内的数字是 id 属性的值)在任何深度、两个方向并考虑任何关系类型。查看文档的Relationships in depth 部分。
虽然这对于小图可以正常工作,但请注意这是一项非常昂贵的操作。考虑到任何关系类型,它将从起点({id : 0}) 遍历整个图表开始。这对于生产环境来说确实不是一个好主意。
【讨论】:
MATCH (root {id : 0})-[*]-(connected) WHERE root <> connected RETURN distinct connected
如果你想匹配与另一个节点有关系的节点,你可以使用这个:
MATCH (n) MATCH (n)-[r]-() RETURN n,r
它将返回与另一个或多个节点有关系的所有节点,无论关系的方向如何。
如果你想添加一个约束,你可以这样做:
MATCH (n:Label {id:"id"}) MATCH (n)-[r]-() RETURN n,r
【讨论】:
对于更大或更紧密互连的图,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' 来获得相同的效果。
【讨论】: