我有类似的东西:
create (:ex {name: "x", ver: 1.0});
create (:ex {name: "x", ver: 1.1});
create (:ex {name: "y", ver: 0.9});
并希望返回任何指定名称的最新版本,例如x-1.1
和y-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()
答案 0 :(得分:1)
当您使用MAX()
和COLLECT()
等aggregation函数(仅在WITH
和RETURN
条款中有效)时,您还可以指定一个或更多非聚合"分组键"在同一条款中。
例如,要获取每个不同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;
此查询按降序版本号对所有节点进行排序,收集具有相同名称的节点(维护顺序),并返回包含每个名称的行和具有最高版本号的该名称的节点。