在 Neo4j 关系查询中使用参数

Using Parameters in Neo4j Relationship Queries

我正在努力解决 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() 的使用允许查询 运行 成功但 returns 没有结果。

本质上,我的图表是 "paths" link "points" 的大量集合。目前的结构如下:

http://console.neo4j.org/r/rholp

我需要能够提供一个起点 (n1Name)、一个终点 (n2Name) 和一条行进路径 (relType)。我需要一个节点列表才能从查询中出来(路径上的所有节点)。

我的图表结构不正确/不是最优的吗?我愿意听取有关整体结构是否不是最佳的建议以及有关如何最好地构建查询的建议!

编辑

关于您的编辑,nodes() 函数 return 是路径上的节点:

MATCH p=allShortestPaths((n:Point { name:"Point5" })-[*]->(n2:Point { name:"Point8" }))
WHERE ALL (r IN rels(p) WHERE type(r)={relType})
RETURN nodes(p)

在控制台link中,是returning节点点5,6,7,8


我想在你的情况下,使用通用关系类型名称连接你的 Point 节点会更有效。

如果有 Path1, Path2, .. 是为了知道两点之间的距离,您可以通过询问路径的长度轻松知道距离,就像这个与您的控制台相关的查询 link :

MATCH (n:Point { name:"Point1" })
WITH n
MATCH (n2:Point { name:"Point4" })
WITH n, n2
MATCH p=shortestPath((n)-[]->(n2))
RETURN length(p)

如果您只需要 return 具有已定义关系长度的路径,您可以通过指定严格的深度来使用它而不使用最短路径:

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 类型

如果您需要匹配类型,例如你的console中第5点到第8点的路径link,而且路径只能有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 样式,也许对需求的简短解释可以帮助我们找到更合适的查询

MATCH p=shortestpath((n1:Point{name:{n1name}})-[:relType *]->(n2:Point {name:{n2name}})) 
RETURN p