我努力解决Neo4j的一个小限制,因为我无法在Cypher查询的关系部分使用参数。
Christophe Willemsen已经慷慨地协助我处理以下问题:
MATCH (n1:Point { name: {n1name} }),
(n2:Point { name: {n2name} }),
p = shortestPath((n1)-[r]->(n2))
WHERE type(r) = {relType}
RETURN p
不幸的是,由于r
是关系集合而不是单一关系,因此失败并显示错误:
scala.collection.immutable.Stream$Cons cannot be cast to org.neo4j.graphdb.Relationship
删除shortestPath()
的使用允许查询成功运行但不返回任何结果。
基本上我的图表是一个大量的"路径"那个链接"点"一起。它目前的结构如下:
http://console.neo4j.org/r/rholp
我需要能够提供一个起点(n1Name
),一个终点(n2Name
)和一条沿着(relType
)行进的路径。我需要一个从查询中出来的节点列表(路径上的所有节点)。
我是否错误地/非最佳地构建了我的图表?我愿意就整体结构是否不是最优的建议以及如何最好地构建查询提出建议!
答案 0 :(得分:1)
修改强>
关于您的编辑, nodes()函数会返回路径上的节点:
MATCH p=allShortestPaths((n:Point { name:"Point5" })-[*]->(n2:Point { name:"Point8" }))
WHERE ALL (r IN rels(p) WHERE type(r)={relType})
RETURN nodes(p)
在控制台链接中,它返回节点Points 5,6,7,8
我想在您的情况下,使用通用关系类型名称来连接 Point 节点会更有效。
如果有一个Path1,Path2,..用于了解两点之间的距离,您可以通过询问路径的长度轻松地知道距离,例如与您的控制台链接相关的查询:
MATCH (n:Point { name:"Point1" })
WITH n
MATCH (n2:Point { name:"Point4" })
WITH n, n2
MATCH p=shortestPath((n)-[]->(n2))
RETURN length(p)
如果只需返回具有已定义关系长度的路径,则可以通过指定严格深度来使用不带shortestPath的路径:
MATCH (n:Point { name:"Point1" })
WITH n
MATCH (n2:Point { name:"Point4" })
WITH n, n2
MATCH p=(n)-[*3..3]->(n2)
RETURN length(p)
LIMIT1
正如您在此处所看到的,指定关系的必要性不是强制性的,如果图表中有其他关系类型,则可以省略它或添加:NEXT类型
如果您需要匹配类型,例如控制台链接中从第5点到第8点的路径,并且路径只能具有PATH_TWO关系,然后您可以执行此操作:
MATCH (n:Point { name:"Point5" })
WITH n
MATCH (n2:Point { name:"Point8" })
WITH n, n2
MATCH p=(n)-[r*]->(n2)
WHERE type(r[0])= 'PATH_TWO'
WITH p, length(p) AS l
ORDER BY l
RETURN p, l
LIMIT 1
如果你真的需要拥有Path1,Path2风格,可能需要一个简短的解释来帮助我们找到更合适的查询
答案 1 :(得分:0)
MATCH p=shortestpath((n1:Point{name:{n1name}})-[:relType *]->(n2:Point {name:{n2name}}))
RETURN p