这是我的图表:
我想运行一个查询来查找图表中两个端口之间的所有简单路径,例如,如果我想要“Bandar Abbas”和“JebelAli”之间的路径,我只需要以下路径:
“Bandar Abbas” - > “JEBELALI”
不是这两个:
“Bandar Abbas” - > “JEBELALI”
“Bandar Abbas” - > “JebelAli” - > “Soha” - > “Chang Choong” - > “JebelAli”
所以我写了这个Chypher查询:
MATCH path=(port1: Port { name: "Bandar Abbas" })-[:CMA*]->(port2: Port { name: "JebelAli" })
WHERE ALL(n in nodes(path) WHERE 1=size(filter(m in nodes(path) WHERE n=m)))
RETURN path;
但它给了我这个错误:
未找到钥匙:UNNAMED50
Neo.DatabaseError.General.UnknownError
答案 0 :(得分:0)
我的错误,如果您想要所有简单路径,那么您可以使用APOC Procedures执行此操作,特别是使用graph algorithms部分中的allSimplePaths过程。
使用示例:
MATCH (port1: Port { name: "Bandar Abbas" }), (port2: Port { name: "JebelAli" })
call apoc.algo.allSimplePaths(port1, port2, 'CMA>', 5) YIELD path
RETURN path
答案 1 :(得分:0)
我用这个查询解决了我的问题:
MATCH path=(port1: Port { name: "Bandar Abbas" })-[:CMA*]->(port2: Port { name: "JebelAli" })
WHERE size(nodes(path))=size(filter(m in nodes(path) WHERE 1=size(filter(n in nodes(path) WHERE n.name=m.name ))))
RETURN path;
但我仍然不知道为什么我的第一个查询给出了错误!。
答案 2 :(得分:0)
这似乎是neo4j 3.1.0中的一个错误(可能就是你正在使用的)。
这是获取所有节点仅出现一次的路径的另一种方法(即,节点数与不同节点的数量相同):
MATCH path=(port1: Port { name: "Bandar Abbas" })-[:CMA*]->(port2: Port { name: "JebelAli" })
WITH path, nodes(path) AS ns
WITH path, ns, COUNT(ns) AS cnt_all
UNWIND ns AS n
WITH path, cnt_all, COUNT(DISTINCT n) AS cnt_distinct
WHERE cnt_all = cnt_distinct
RETURN path;