如何获取从一个节点到另一个节点的路径,包括其间涉及的所有其他节点和关系

时间:2018-03-09 14:27:02

标签: graph neo4j cypher path-finding

我在Neo4j中设计了一个模型,以便从一个站到另一个站获取路径,包括涉及的平台/支路。这个模型在这里描述。基本上,我需要一个查询来带我从NBW到RD。还显示了涉及的平台和腿。我正在努力解决这个问题。我没有结果。感谢有人帮忙。

这是我的密码声明:

typealias MyGenericFunction<T: SomeProtocol> = (T) -> T

var f1: MyGenericFunction<SomeConformerType> // expanded to (SomeConformerType) -> SomeConformerType
var f2: MyGenericFunction<AnotherConformerType> // expanded to (AnotherConformerType) -> AnotherConformerType

型号: enter image description here

2 个答案:

答案 0 :(得分:3)

如评论中所述,在Cypher中,您无法使用有向变长关系,该关系对某些关系使用不同的方向。

但是,APOC Procedures刚刚添加了基于关系序列进行扩展的功能。你可以尝试一下:

MATCH (start:station), (end:station)
WHERE start.name='NBW' AND end.name='THT'
CALL apoc.path.expandConfig(start, {terminatorNodes:[end], limit:1,
  relationshipFilter:'has_platform>, can_board>, goto>, can_alight>, <has_platform'}) YIELD path
RETURN path 

我添加了一个限制,以便只返回终端站的第一个(也是最短的)路径。删除限制是不可取的,因为这将继续重复扩展中的关系,从一个站到另一个站,直到它找到所有可能的方式到达您的终端站,这可能会挂起您的查询。

修改

关于新模型的更改,上述原因不起作用的原因是因为关系序列不能在其中包含可变长度序列。您有2 goto>个关系可以遍历,但序列中只指定了一个。

这是一种不使用序列的替代方案,只是允许关系的白名单。 spanningTree()过程使用NODE_GLOBAL唯一性,因此每个找到的节点只有一条唯一的路径(路径不会回溯或重新访问以前访问过的节点)。

MATCH (start:station), (end:station)
WHERE start.name='NBW' AND end.name='RD'
CALL apoc.path.spanningTree(start, {terminatorNodes:[end], limit:1,
  relationshipFilter:'has_platform>|can_board>|goto>|can_alight>|<has_platform'}) YIELD path
RETURN path 

答案 1 :(得分:0)

您的查询是针对-->的,并非两个工作站之间的所有关系都朝同一方向运行。如果删除关系方向,则会得到结果。

然后,一旦你得到了一个结果,我认为这样的事情可以让你指出正确的方向,一旦你开始工作就从结果路径中提取特定的细节。

基本上我假设您感兴趣的所有内容都在您返回的路径中,您只需要过滤掉返回的不同部分。

正如@InverseFalcon指出的那样,这个查询应该限制在一个更大的图表中,否则很容易就会逃跑。

MATCH p = (a:Station)-[r:Goto|can_board|can_alight|has_platfrom*0..]-(c:Station) 
WHERE (a.name='NBW') 
AND c.name='THT' 
RETURN filter( n in nodes(p) WHERE 'Platform' in labels(n)) AS Platforms