我正在寻找解决以下问题的提示:
给定Neo4j DB,将两种节点类型应用为标签
:地址和:里程碑(每个节点一个)
在不同节点之间有指向:LEADS_TO关系.
鉴于以下模式(我跳过关系的[]):
模式1:
(a:Address)->(:Milestone)->(:Milestone)<-(:Milestone)<-(:Milestone)<-(b:Address)
Run Code Online (Sandbox Code Playgroud)
模式2:
(a:Address)->(:Milestone)->(c:Address)<-(:Milestone)<-(b:Address)
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个只包含shortestPath分析中相同类型的"中间"节点的查询.在我的情况下,它应该只包含带有标签的节点:Milestone并跳过具有标记节点的较短路径:地址介于两者之间.
换句话说:查询应该匹配模式1而不是模式2,即使它更短.
我发现以下解决方案接近但在我的情况下失败,因为它也涵盖了开始和结束节点标签,因为它根本不选择任何行:
MATCH p=shortestPath( (a:Address)-[:LEADS_TO*..10]-(b:Address) )
WHERE a.name = 'XYZ'
AND b.name = 'ABC'
AND ALL(x IN nodes(p) WHERE (x:MILESTONE))
RETURN p
Run Code Online (Sandbox Code Playgroud)
我最初的想法是创建第一跳:
对于"开始"节点
MATCH (a:Address)-[:LEADS_TO]->(aa:Milestone)
Run Code Online (Sandbox Code Playgroud)
并且类似于结束节点并从那里开始查询.
但这是有问题的,因为每个:Address节点可以有多个:LEADS_TO关系.查询定义的起始和结束节点的最短路径,这种方法将为一个查询创建n个起始节点和m个终端节点,这些查询可以使用不同的起始节点和结束节点执行.
有没有人知道如何从Cypher中的WHERE子句中排除开始和结束节点?
非常感谢任何提示.