2015-10-14 74 views
1

我正在写一个密码查询来将信息合并到一个结果为我的网站。当我把它都聚集在一个Cypher组所有的结果都为5:一些帮助理解Cypher

MATCH (p:Person{username:"wkolcz"}) 
MATCH(p)-[]->(um:Meetup{status:"Accepted"}) 
WHERE toInt(um.meet_date) >= 1444827367 
MATCH(p)-[]->(pm:Meetup{status:"Accepted"}) 
WHERE toInt(pm.meet_date) <= 1444827367 
MATCH (p)-[:MEMBER_OF]->(g:Group) 
RETURN count(um) as upcoming, count(pm) as past_meetups, count(g) as group_total 

但是当我打破他们到各个查询和输出结果,它们是正确的。我错过了什么?谢谢!

MATCH (p:Person{username:"wkolcz"}) 
MATCH(p)-[]->(pm:Meetup{status:"Accepted"}) 
WHERE toInt(pm.meet_date) <= 1444827367 
RETURN count(pm) as past_meetups 

结果是1(正确)

MATCH (p:Person{username:"wkolcz"}) 
MATCH(p)-[]->(um:Meetup{status:"Accepted"}) 
WHERE toInt(um.meet_date) >= 1444827367 
RETURN count(um) as upcoming 

,结果为1(正确)

MATCH (p:Person{username:"wkolcz"}) 
MATCH (p)-[:MEMBER_OF]->(g:Group) 
RETURN count(g) as group_total 

结果为5(正确)

回答

1

所以问题是你所有的MATCH在一起正在形成一个大的子图模式匹配,并且Neo4j匹配它可以找到那些匹配的所有排列。有可能是一个更好的解决方案,而是一个办法来解决这个问题就简单地做一个比赛的时间和与WITH穿过结果:

MATCH (p:Person {username:"wkolcz"}) 
OPTIONAL MATCH (p)-[]->(um:Meetup {status:"Accepted"}) 
WHERE toInt(um.meet_date) >= 1444827367 
WITH p, count(um) as upcoming 

OPTIONAL MATCH (p)-[]->(pm:Meetup {status:"Accepted"}) 
WHERE toInt(pm.meet_date) <= 1444827367 
WITH p, upcoming, count(pm) as past_meetups 

OPTIONAL MATCH (p)-[:MEMBER_OF]->(g:Group) 
RETURN upcoming, past_meetups, count(g) as group_total 
0

我想你可能有更多运气使用OPTIONAL MATCH

MATCH (p:Person {username:"wkolcz"}) 
OPTIONAL MATCH (p)-[]->(um:Meetup {status:"Accepted"}) 
WHERE toInt(um.meet_date) >= 1444827367 
OPTIONAL MATCH (p)-[]->(pm:Meetup {status:"Accepted"}) 
WHERE toInt(pm.meet_date) <= 1444827367 
OPTIONAL MATCH (p)-[:MEMBER_OF]->(g:Group) 
RETURN count(um) as upcoming, count(pm) as past_meetups, count(g) as group_total 

这也应该给你的条目,其中count()为零,MATCH不允许。

+0

感谢布赖恩。其实我从这开始,仍然与所有5的相同结果 –

+0

我不确定你的意思是所有5s ......你能提供一个设置脚本吗?或者可以在这里用分享按钮设置一个例子http://neo4j-console-22.herokuapp.com/? –

+0

所有三个项目的结果都是5.所以输出结果是5个即将到来的,5个过去的成就和5个group_total。只有组数应该是5,在数据库中只有1个past_meetup和1个即将见面的聚会。看起来,它将最后一个项目的结果分配给所有变量。 –