如何构建相关子查询?

时间:2016-06-23 08:27:47

标签: neo4j cypher

我有类似的东西:

create (:ex {name: "x", ver: 1.0});
create (:ex {name: "x", ver: 1.1});
create (:ex {name: "y", ver: 0.9});

并希望返回任何指定名称的最新版本,例如x-1.1y-0.9。我试过这个:

match (n:ex), (m:ex) where m.name = n.name and m.ver = max(n.ver) return m

但是neo讨厌我:

  

在此上下文中使用聚合函数max(...)无效(第1行,第(x)栏(偏移:61))

这里有什么正确的方法?

*编辑I *

我也尝试将我的版本串在一起:

create (:ex {name: "x", ver: 1.0})-[:PrecededBy]->(:ex {name: "x", ver: 1.1});
match (n:ex {name: "x", ver: 1.1}) create (n)->[:PrecededBy]->(:ex {name: "x", ver: 1.2});
create (:ex {name: "y", ver: 0.9});

以为我可以使用endNode(),但这似乎根本不起作用:

match (n:ex)-[r]-() return endNode(r)

返回3个节点!

*编辑II *

我可能认为这样的事情可能有用:

match p=(:ex)-[*]->(:ex) return last(nodes(p))

但很明显我不理解last()

1 个答案:

答案 0 :(得分:1)

当您使用MAX()COLLECT()aggregation函数(仅在WITHRETURN条款中有效)时,您还可以指定一个或更多非聚合"分组键"在同一条款中。

例如,要获取每个不同max_ver的最大版本(name)("分组键"):

MATCH (n:ex)
RETURN n.name AS name, MAX(n.ver) AS max_ver;

[增订]

另一方面,如果你想获得每个名字的最大版本的节点,这是一种方法:

MATCH (n:ex)
WITH n
ORDER BY n.ver DESC
WITH n.name AS name, COLLECT(n) AS ns
RETURN name, ns[0] AS latest;

此查询按降序版本号对所有节点进行排序,收集具有相同名称的节点(维护顺序),并返回包含每个名称的行和具有最高版本号的该名称的节点。