我是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)?
谢谢, 肖恩
答案 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"] │
└────────────────────────────┘