如何获得两个节点之间的所有唯一路径?

时间:2019-05-25 20:39:53

标签: neo4j cypher

我正在使用trek and mountaineering routing database,并尝试查找DarjeelingSandakphu之间的所有可能路线。

这不是问题-这是对此的查询:

MATCH allPaths=(town:town{name:'Darjeeling'})-[*]->(peak:peak{name:'Sandakphu'})
RETURN allPaths

但是此查询多次返回相同的路由,例如:

╒══════════════════════════════════════════════════════════════════════╕
│"allPaths"                                                            │
╞══════════════════════════════════════════════════════════════════════╡
│[{"name":"Darjeeling"},{"name":"Darjeeling-Rimbik","winter":"true","di│
│stance":15,"summer":"true"},{"name":"Rimbik"},{"name":"Rimbik"},{"name│
│":"Rimbik-Sirikhola","winter":"true","distance":4,"summer":"true"},{"n│
│ame":"Sirikhola"},{"name":"Sirikhola"},{"name":"Sirikhola-Gurdum","win│
│ter":"true","distance":6,"summer":"true"},{"name":"Gurdum"},{"name":"G│
│urdum"},{"name":"Gurdum-Sandakphu","winter":"true","distance":12,"summ│
│er":"true"},{"name":"Sandakphu","altitude":"12400 ft"}]               │
├──────────────────────────────────────────────────────────────────────┤
│[{"name":"Darjeeling"},{"name":"Darjeeling-Rimbik","winter":"true","di│
│stance":15,"summer":"true"},{"name":"Rimbik"},{"name":"Rimbik"},{"name│
│":"Rimbik-Sirikhola","winter":"true","distance":4,"summer":"true"},{"n│
│ame":"Sirikhola"},{"name":"Sirikhola"},{"name":"Sirikhola-Gurdum","win│
│ter":"true","distance":6,"summer":"true"},{"name":"Gurdum"},{"name":"G│
│urdum"},{"name":"Gurdum-Sandakphu","winter":"true","distance":12,"summ│
│er":"true"},{"name":"Sandakphu","altitude":"12400 ft"}]               │
├──────────────────────────────────────────────────────────────────────┤

我已经尝试在documentation中提到的DISTINCT上使用RETURN

MATCH allPaths=(town:town{name:'Darjeeling'})-[*]->(peak:peak{name:'Sandakphu'})
RETURN DISTINCT allPaths

但不幸的是,它不起作用。

2 个答案:

答案 0 :(得分:1)

Neo4j不能多次返回相同的路由,这不可能。路径应该是不同的,并且使用<?php $fp = fsockopen("localhost", 3332, $errno, $errstr, 3); if (!$fp) { echo "$errstr ($errno)<br />\n"; } else { fwrite($fp, "FSBC004000"); echo fgets($fp, 128); fclose($fp); } } ?> 时使用相同的结果集就可以证明这一点。

编辑

使用相同的数据集,我重新创建了这个数据集。路径是不同的。让您烦恼的是,在同一组节点之间存在多个关系(例如,在Tumbling和Gairibus之间存在3种关系,类型为:trek,:road和:twowheeler),它们都具有相同的属性。

在Neo4j浏览器中,当显示关系的文本数据时,仅输出关系属性,而不输出类型或ID,因此只需对关系结果(例如路径中存在的关系)进行视觉检查即可似乎路径是相同的,但路径却不相同。

实际的代码结果(如果您使用驱动程序来调用Neo4j并获取查询结果)将包括id和关系类型信息,因此,只是浏览器的可视显示忽略了可以区分结果的信息。

您可以使用156条不同的路径,但是这些路径大多通过相同的节点,只是使用不同可能关系的排列遍历这些节点。

如果您想要忽略这些关系选择的路径,则将查询限制在:trek关系中,因为当连接两个节点时,这些关系始终存在:

RETURN DISTINCT allPaths

这仅返回6条可能的路径。

答案 1 :(得分:0)

您是否尝试过别名化关系,然后分别返回(并且仅返回)?

match (town:town{name:'Darjeeling'})-[r]->(peak:peak{name:'Sandakphu'})
return distinct r

Neo4J中的一项约定虽然未强制执行,但也是在UpperCamelCase中创建标签(镇而非城镇,Peak而非peak)。