有没有办法通过关系属性的总和来限制密码查询?
我正在尝试创建一个cypher查询,该查询返回距离起始节点100的距离内的节点。所有关系都设置了距离,路径中所有距离的总和是距起始节点的总距离。
如果WHERE子句可以处理聚合函数,那么我正在寻找的可能是这样的
START n=node(1)
MATCH path = n-[rel:street*]-x
WHERE SUM( rel.distance ) < 100
RETURN x
有没有办法可以求出where子句路径中关系的距离?
答案 0 :(得分:1)
当然,您想要做的就像在SQL查询中一样。
在cypher中,您可以使用WITH
链接查询细分并使用下一部分中之前部分的结果,请参阅manual。
对于你的例子,我们假设:
START n=node(1)
MATCH n-[rel:street*]-x
WITH SUM(rel.distance) as distance
WHERE distance < 100
RETURN x
遗憾的是,sum不适用于集合
所以我尝试以不同的方式(对于可变长度路径):
START n=node(1)
MATCH n-[rel:street*]-x
WITH collect(rel.distance) as distances
WITH head(distances) + head(tail(distances)) + head(tail(tail(distances))) as distance
WHERE distance < 100
RETURN x
不幸的是,空列表的头部不会返回null
coalesce
到0
,但只是失败。所以这种方法只适用于固定长度的路径,不知道这是否适合你。
答案 1 :(得分:0)
我最近遇到了同样的问题。在更新版本的neo4j中,这是通过 extract 和 reduce 子句解决的。你可以写:
START n=node(1)
MATCH path = (n)-[rel:street*..100]-(x)
WITH extract(x in rel | x.distance) as distances, x
WITH reduce(res = 0, x in rs | res + x) as distance, x
WHERE distance <100
RETURN x
答案 2 :(得分:-1)
我不知道WHERE子句中的限制,但您可以在MATCH子句中简单地指定它:
START n=node(1)
MATCH path = n-[rel:street*..100]-x
RETURN x
请参阅http://docs.neo4j.org/chunked/milestone/query-match.html#match-variable-length-relationships