没有跨越某些节点的密码路径

时间:2018-08-23 08:43:33

标签: neo4j cypher

我是cypher的新手,但正在努力应对基本查询。

我需要获取所有标记为属性IsPrimaryEntity(PE)的节点之间的路径 没有包含任何其他PE节点的路径

(PE1)----(n1)------(n2)-(PE2)-(n3)-(PE3)-(PE4)
     \(n4)-(n5)---/

只会产生4个结果

(PE1)-(n1)-(n2)-(PE2)
(PE1)-(n4)-(n5)-(n2)-(PE2)
(PE2)-(n3)-(PE3)
(PE3)-(PE4)

这是我目前拥有的

MATCH p=(s {IsPrimaryEntity: true})<-[*..10]->(o {IsPrimaryEntity: true})
WHERE NOT s=o
RETURN p,s,o

重要的是不要返回路径(PE1).....(PE4)?

谢谢, 肖恩

1 个答案:

答案 0 :(得分:0)

如果能够使用附加标签(例如:PrimaryEntity)进行跟踪,这会有所帮助。

我们可以使用APOC Procedures path expander procs,因为仅靠Cypher来完成这项工作很困难。

这是我用来创建示例图的查询:

create (PE1:PrimaryEntity {name:'PE1'})-[:REL]->(:Node {id:'n1'})-[:REL]->(n2:Node {id:'n2'})-[:REL]->(PE2:PrimaryEntity {name:'PE2'})
create (PE1)-[:REL]->(:Node {id:'n4'})-[:REL]->(:Node {id:'n5'})-[:REL]->(n2)
create (PE2)-[:REL]->(:Node {id:'n3'})-[:REL]->(PE3:PrimaryEntity {name:'PE3'})
create (PE3)-[:REL]->(PE4:PrimaryEntity {name:'PE4'})

我们可以使用apoc.path.expandConfig()进行查询,因为我们需要所有可能的路径,但是我们要确保在到达另一个:PrimaryEntity节点时停止(我们将使用终止标签过滤器,这将使我们仅扩展到:PrimaryEntity节点,然后停止扩展。返回的唯一路径将是这些节点。我们还将在起始节点和结束节点的ID上使用谓词,以确保我们不返回返回到起始节点的电路的路径,并且不返回镜像路径(相同的路径,但包含起始位置)和末端节点切换)。

MATCH (p:PrimaryEntity)
CALL apoc.path.expandConfig(p, {labelFilter:'/PrimaryEntity', maxLevel:10}) YIELD path
WHERE id(p) < id(last(nodes(path)))
RETURN [node in nodes(path) | coalesce(node.name, node.id)] as paths

返回只是产生易于阅读的输出。

这使我们:

╒════════════════════════════╕ │"paths" │ ╞════════════════════════════╡ │["PE1","n1","n2","PE2"] │ ├────────────────────────────┤ │["PE1","n4","n5","n2","PE2"]│ ├────────────────────────────┤ │["PE2","n3","PE3"] │ ├────────────────────────────┤ │["PE3","PE4"] │ └────────────────────────────┘