2013-08-17 30 views
1

我试图执行以下的Cypher查询暗号 - 问题与在+总结+用

START b=node:customer_idx(ID = 'ABCD') 
MATCH p = b-[r1:LIKES]->stuff, someone_else_too-[r2:LIKES]->stuff 
with b,someone_else_too, count(*) as matchingstuffcount 
where matchingstuffcount > 1 
//with b, someone_else_too, matchingstuffcount, CASE WHEN ...that has r1, r2... END as SortIndex 
return someone_else_too, SortIndex 
order by SortIndex 

上述查询工作正常,但此刻我去掉低“与”我收到以下错误

Unknown identifier `b`. 
Unknown identifier `someone_else_too`. 
Unknown identifier `matchingstuffcount`. 
Unknown identifier `r1`. 
Unknown identifier `r2`. 

为了解决这个问题,我把r1和r2放在最上面, - "with b,someone_else_too, count(*) as matchingstuffcount"."with b, r1, r2, someone_else_too, count(*) as matchingstuffcount".这样就混淆了我的count(*) > 1条件,因为count(*)不能合适地聚合。

任何解决方法/建议过滤掉count(*)> 1,同时确保Case When也可以执行?

回答

0

在neo4j 2.0下通过console.neo4j.org我能够得到以下查询的工作。我试图模仿你的构造,即WITH/WHERE/WITH/RETURN序列。 (如果我错过了什么,请让我知道!)

START n=node:node_auto_index(name='Neo') 
MATCH n-[r:KNOWS|LOVES*]->m 
WITH n,COUNT(r) AS cnt,m 
WHERE cnt >1 
WITH n, cnt, m, CASE WHEN m.name?='Cypher' THEN 1 ELSE 0 END AS isCypher 
RETURN n AS Neo, cnt, m, isCypher 
ORDER BY cnt 

更新或更改其here

+0

嗨,爱德华,在你的解决方案中,如果你想返回r(或r的一个属性),问题就来了。所以查询看起来像START n = node:node_auto_index(name ='Neo') MATCH n- [r:KNOWS | LOVES *] - > m WITH n,r,COUNT(r)AS cnt,m WHERE cnt> 1 WITH n,r,cnt,m,CASE WHEN m.name?='Cypher'THEN 1 ELSE 0 END AS isCypher RETURN n AS Neo,cnt,m,isCypher,r ORDER BY cnt。这将不返回行(或错误的计数)。在这里看到的模拟[链接](http://console.neo4j.org/r/i59lpv) – Anshul

+0

但这是绝对有道理的,因为如果你在第一个'WITH'子句中加上'r',你就可以有效地将每个关系分别。这意味着所有的行都将失败'WHERE cnt> 1'测试。在你的例子中,如果你删除了'WHERE'子句,你会得到结果。 – Edward

+0

所以简单说吧。我有一个关系属性Pct。我想按照desc排序。所以我使用Order By r.Pct。另外,我想删除计数小于2的行,因为那些结果偏斜。在你分享的例子中,我们可以做一个或另一个,但不能两个都完成 - 过滤和排序关系就是我想要做的。 – Anshul