我正在使用trek and mountaineering routing database,并尝试查找Darjeeling
和Sandakphu
之间的所有可能路线。
这不是问题-这是对此的查询:
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
但不幸的是,它不起作用。
答案 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)。