Neo4j:来自多个匹配的多个计数

时间:2016-03-11 00:22:39

标签: neo4j cypher

给出类似于

的neo4j架构
(:Person)-[:OWNS]-(:Book)-[:CATEGORIZED_AS]-(:Category)

我试图写一个查询来获取每个人拥有的书籍数量以及每个类别中的书籍数量,以便我可以计算每个人每个类别中书籍的百分比。< / p>

我已尝试过

的查询
match (p:Person)-[:OWNS]-(b:Book)-[:CATEGORIZED_AS]-(c:Category)
where person.name in []
with p, b, c
match (p)-[:OWNS]-(b2:Book)-[:CATEGORIZED_AS]-(c2:Category)
with p, b, c, b2
return p.name, b.name, c.name,
count(distinct b) as count_books_in_category,
count(distinct b2) as count_books_total

但是在尝试进行第二场比赛时,查询计划绝对可怕。我试图找出不同的方式来编写查询,以便我可以做两个不同的计数,但除了做两个匹配之外,还没有想出任何其他的东西。我的架构并不是关于人和书的。我的示例中的:CATEGORIZED_AS关系实际上是一些不同的关系选项,指定为[:option1 | option2 | option3]。所以在我的第二场比赛中,我重复了关系选项,这样我的总数就会被他们限制。

想法?这感觉与Neo4j - apply match to each result of previous match类似,但对于那个似乎并不是一个好的答案。

1 个答案:

答案 0 :(得分:3)

UNWIND是你的朋友。首先,计算每人的总书数,随时收集。 然后展开它们,以便您可以匹配它们属于哪些类别。 按类别和人员汇总,您应该获得每个类别中的书籍数量

match (p:Person)-[:OWNS]->(b:Book)
with p,collect(b) as books, count(b) as total
with p,total,books 
unwind books as book
match (book)-[:CATEGORIZED_AS]->(c)
return p,c, count(book) as subtotal, total
相关问题