在where子句中使用聚合的复杂查询

时间:2015-03-17 13:12:36

标签: neo4j cypher

假设我有一个图形,其中对于BallT类型的每对节点m,n,可以有一个BallD类型的节点k,它通过类型Rel的关系连接它们,也就是说,可以有多个模式的亲切p=(m:BallT)-[r:Rel]-(k:BallD)-[s:Rel]-(n:BallT)。对于给定节点m(满足例如m.key="whatever"),让我们调用Nmn连接m和某个节点n和N的BallD的数量,BallD节点的总数。对于这个给定的节点,我怎样才能找到所有节点n,使得Nmn> N / 2并按Nnm排序结果?我正在尝试查询:

match (D:BallD)
with count(D) as N
match (m:BallT {key:"whatever"})-[r]-(d:BallD)-[s]-(n:BallT)
with N, distinct n as n_dist, count(d) as Nmn
where Nmn >= N
return n_dist
order by Nmn

但我正在

Invalid input 't': expected whitespace, comment, node labels, MapLiteral, a parameter, a relationship pattern

2 个答案:

答案 0 :(得分:2)

此查询是否符合您的要求?

MATCH (D:BallD)
WITH count(D) as N
MATCH (m:BallT {key:"whatever"})--(d:BallD)--(n:BallT)
WITH N, n, count(d) as Nmn
WHERE Nmn >= N/2
RETURN n, Nmn
ORDER BY Nmn
  • 在值(如count)上使用聚合函数(如n)时,您无需使用DISTINCT来限定要聚合的值结束 - 这是自动完成的。

  • ORDER BY参数必须引用返回值的一部分。

  • 此外,我更正了WHERE子句以使用N/2

答案 1 :(得分:0)

仅供将来参考!!我想做的事情:我在地图d中出现了一系列键[“k1”,..,“kn”]。对于每个密钥ki(i = 1,..,n),我想为它创建节点(如果尚未创建),计算该映射中ki的出现次数以及增加ki的出现总次数在我最终要插入数据库的所有地图中。要执行这一组创建,我执行此查询:

create (d:Map)
with d
unwind [k1,...,kn] as k0
with distinct k0 as kd0, count(k0) as c, d
merge (k:Key {key: kd0})
on create set t.count = c, t.mapCount = 1
on match set t.count = t.count + c, t.mapCount = t.mapCount + 1
create (d)-[r:Contains {count: c}]->(t)
return t

请注意,在此查询中,我在表示它的节点中注册了ki的总出现次数,并且在关系(类型包含)中的某些映射d中出现了ki的出现次数(对不起我的坏英语) !呵呵)

然后,让我说我想找到与键[k1,...,kn]共同出现的所有键k(即通过某些地图d),但仅限于那些共同出现的键k “使用ki(即,与k和ki相关的地图的数量,i = 1,...,n大于M),但一般不会出现”很多“(即k出现的地图数量)一般来说小于N)。在这种情况下,我执行以下查询:

unwind [k1,...,kn] as ki
match (:Key {key: ki})<-[r:Contains]-(d:Map)-[s:Contains]->(k:Key)
where k.mapCount < N
with distinct(k) as kd, count(d) as x
where x > M
return kd
order by x desc, kd.count desc
limit 5

请注意,在此查询中,我首先按x(包含ki和k的映射的数量)排序结果,然后按k的出现次数排序,即,如果两个k具有相同的x,则先放置k计数更高。

非常感谢回复人....我从来不是StackOverflow的常用用户,但现在我觉得我会用它很多!! :)