【发布时间】:2014-07-14 14:31:36
【问题描述】:
我正在玩 cypher,我正在做一些简单的聚合。
MATCH (p:Person)-[:HAS_CAR]->(n:Car)
RETURN n, count(p)
MATCH (p:Person)-[:HAS_APARTMENT]->(n:Apartment)
RETURN n, count(p)
MATCH (p:Person)-[:HAS_HOUSE]->(n:House)
RETURN n, count(p)
问题是我必须对数据库进行 3 次访问才能将所有这些结果汇总在一起。问题在于这些查询是更大链中的最后一个MATCH 语句。像这样:
MATCH (:City { Id: 10})<-[:LIVES_IN]-(p:Person)
WITH p
MATCH ...
WITH p
MATCH ...
WITH p
MATCH ...
WITH p
MATCH ...
WITH p
MATCH p-[:HAS_CAR]->(n:Car)
RETURN n, count(p)
在所有这些MATCH ... WITH 语句之后,只有几个人节点匹配,所以查询的最后部分非常快,但初始部分不是。我不禁认为这可以改进,因为所有三个查询共享很多语句。
我想出了这个:
...
MATCH p-[:HAS_CAR|HAS_APARTMENT|HAS_HOUSE]->(n)
RETURN n, labels(n), count(p)
我可以使用它。但是,如果我想混合这样的东西怎么办:
MATCH p-[:KNOWS]->(:Person)-[:HAS_BIKE]->(n:Bike)
RETURN n, count(p)
甚至:
MATCH p-[:KNOWS]->(:Person)-[:HAS_BIKE|HAS_BOAT]->(n)
RETURN n, labels(n), count(p)
所有这些都可以在一个查询中完成吗?如何完成?
【问题讨论】: