6

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

我正在尝试创建一个密码查询,该查询返回距离起始节点 100 以内的节点。所有的关系都有一个距离集,一条路径中所有距离的总和就是到起始节点的总距离。

如果 WHERE 子句可以处理聚合函数,我正在寻找的可能看起来像这样

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

有没有一种方法可以对 where 子句的路径中的关系距离求和?

4

3 回答 3

1

当然,您想要做的就像一个 SQL 查询。

在 cypher 中,您可以链接查询段并在下一部分中使用前一部分的结果WITH,请参阅手册

对于您的示例,假设:

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

于 2012-09-18T21:10:24.230 回答
1

我最近遇到了同样的问题。在 Neo4j 的更新版本中,这通过extractreduce子句解决。你可以写:

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
于 2016-06-29T08:36:11.217 回答
-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

于 2012-09-17T13:40:08.110 回答