通过关系属性的总和来限制Neo4j cypher查询结果

时间:2012-09-16 17:59:53

标签: neo4j cypher

有没有办法通过关系属性的总和来限制密码查询?

我正在尝试创建一个cypher查询,该查询返回距离起始节点100的距离内的节点。所有关系都设置了距离,路径中所有距离的总和是距起始节点的总距离。

如果WHERE子句可以处理聚合函数,那么我正在寻找的可能是这样的

START n=node(1)
MATCH path = n-[rel:street*]-x
WHERE SUM( rel.distance ) < 100
RETURN x

有没有办法可以求出where子句路径中关系的距离?

3 个答案:

答案 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 coalesce0,但只是失败。所以这种方法只适用于固定长度的路径,不知道这是否适合你。

答案 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