计算相关销售关系的数量

时间:2014-01-23 18:31:01

标签: neo4j cypher

在Cypher查询上寻求一些帮助。鉴于拥有图书peer的一组客户p,我可以检索一组客户target,这些客户至少拥有一本也由peer拥有但仍然拥有的图书不拥有p。这是使用以下查询完成的:

match 
(p:Book {isbn:"123456"})<-[:owns]-(peer:Customer)
  -[:owns]->(other:Book)<-[o:owns]-(target:Customer)
WHERE NOT( (target)-[:owns]->(p))
return target.name
limit 10;

我的下一步是确定 other集的每个成员拥有多少本 target本书,并相应地订购这些成员。我根据Neo4j文档和SO答案尝试了几种变体,但我没有运气。例如,我尝试使用with

match 
  (p:Book {isbn:"123456"})<-[:owns]-(peer:Customer)
  -[:owns]->(other:Book)<-[o:owns]-(target:Customer)
WHERE NOT( (target)-[:owns]->(p))
WITH target, count(o) as co
WHERE co > 1
return target.name
limit 10;

我也试过看起来我新手的眼睛是最合理的查询:

match 
  (p:Book {isbn:"123456"})<-[:owns]-(peer:Customer)
  -[:owns]->(other:Book)<-[o:owns]-(target:Customer)
WHERE NOT( (target)-[:owns]->(p))
return target.name, count(o)
limit 10;

在这两种情况下,查询都会在没有结束的情况下运行(在我停止执行之前超过10分钟)。对我做错了什么的任何见解?

修改 事实证明后一个查询确实执行但需要15分钟才能完成并报告错误的数字,如下所示:

+-------------------------------+
| target.name        | count(o) |
+-------------------------------+
| "John Smith"       | 12840    |
| "Mary Moore"       | 11501    |
+-------------------------------+

我正在寻找每个客户特别拥有的图书数量,不确定这些1284011501数字来自哪里。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这个怎么样:

MATCH (p:Book {isbn:"123456"})<-[:owns]-(peer:Customer)
WITH distinct peer, p
MATCH (peer)-[:owns]->(other:Book)
WITH distinct other, p
MATCH (other)<-[o:owns]-(target:Customer)
WHERE NOT((target)-[:owns]->(p))
RETURN target.name, count(o)
LIMIT 10;