我希望在通过给定节点的图形上获得所有 simple cycles
/ circuits
. 我能用这个密码查询:
MATCH p=(n)-[*]->(n)
WHERE n.postId = 71 //postId is a node property
RETURN nodes(p)
然而,上面检索“电路”中的重复节点(除了起始节点和结束节点之外),根据图论,它根本不是电路 .
通过以下查询,我可以删除电路中的那些重复项,但我必须限制 MATCH
模式中的电路或路径的长度,这是一种硬编码方式 .
// In this example the length of the path is hardcoded to 4
MATCH p=
(n)-[:RELATES_TO]->
(p2)-[:RELATES_TO]->
(p3)-[:RELATES_TO]->
(p4)-[:RELATES_TO]->(n)
WHERE n.postId = 71
AND p2.postId <> 71
AND p3.postId <> 71
AND p4.postId <> 71
RETURN nodes(p)
有没有办法在第一个查询中过滤关系之间的节点?
MATCH p=(n)-[*]->(n)
WHERE n.postId = 71 //postId is a node property
RETURN nodes(p)
重要笔记:
- 我知道如何限制路径的长度(通过WHERE length()约束或variable length relationships)
3 回答
虽然这可能没有使用allInmpleFscon所建议的那样使用allSimplePaths APOC过程那么快(我还没有尝试过),但是这里有一个在纯Cypher中获取简单路径的方法:
基本上,此查询要求路径中不同节点的数量等于节点数减1(因为最后一个节点必须与第一个节点相同) .
您可能想要试用APOC程序库,特别是图算法部分中的allSimplePaths函数 . 简单路径应该没有重复节点 .
编辑
注意,当前该算法当前不能用于查找起始节点和结束节点相同的简单循环 .
但是,如果将结束节点定义为循环中倒数第二步,将起始节点的所有相邻节点定义为与起始节点具有定向关系,那么您应该能够获得结果(尽管路径显然不会包括最后遍历到起始节点来完成循环) .
你尝试过使用filter()或none()吗?我想我正确地理解了你的问题,但这就是我如何使用上述功能 . (如果这是关闭的,只需要下来 . )
要点:http://console.neo4j.org/?id=99xkcu
需要使用可变长度查询,因为
:phone_number_of
指针可以来自扩展名(链接到电话号码)或电话号码本身 . 箭头方向无关紧要,您可以撤消其中任何一个并尝试以下查询 .(1)获取从人到电话号码的每条可能路径(为便于阅读而编辑):
(2)使用
none()
通过过滤掉包含特定节点(具有特定属性或标签的节点)的路径来删除冗余:(3)使用
filter()
从返回的路径中删除特定节点: