在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 |
+-------------------------------+
我正在寻找每个客户特别拥有的图书数量,不确定这些12840
和11501
数字来自哪里。有什么想法吗?
答案 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;