neo4j - 从 cypher 中的多个特定路径查询节点

标签 neo4j cypher

我正在玩 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)

所有这些都可以在一个查询中完成吗?如何完成?

最佳答案

有时您需要使用集合而不是行来将聚合查询合并在一起并传递它们。这个策略可能会有所帮助...例如:

MATCH (p:Person)-[:HAS_CAR]->(car:Car)
WITH car, count(p) carCount
WITH collect({car:car, count:carCount}) as carCounts
MATCH (p:Person)-[:HAS_APARTMENT]->(n:Apartment)
WITH n, count(p) as apartmentCount, carCounts
RETURN collect({apartment:n, count:apartmentCount}) as apartmentCounts, carCounts

更新(请参阅评论)--这可以让您传递过滤器的结果并进行快速 ID 查找以再次找到它们:

MATCH (p:Person)
WHERE p.name = "John" // or whatever else you need to filter on
WITH collect(id(p)) as pids
MATCH (p)-[:HAS_CAR]->(car:Car)
WHERE id(p) IN pids
WITH car, count(p) carCount, pids
WITH collect({car:car, count:carCount}) as carCounts, pids
MATCH (p)-[:HAS_APARTMENT]->(n:Apartment)
WHERE id(p) IN pids
WITH n, count(p) as apartmentCount, carCounts
RETURN collect({apartment:n, count:apartmentCount}) as apartmentCounts, carCounts

关于neo4j - 从 cypher 中的多个特定路径查询节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24699688/

相关文章:

java - 使用 Scala 在 Neo4j 中建立索引关系

java - 具有两个集合的计算字段

arrays - Neo4j - 关系内数组内的数组

java - Spring Neo4j 事务回滚不起作用

java - 在 Neo4J 中,如何在 Java 的密码查询中将标签设置为参数?

Neo4j:Cypher 示例查询的结果让我困惑

graph - 如何在 Neo4j 中返回前 n 个最大的集群?

neo4j - 如何使用密码验证路径中是否存在某些节点

具有关系层次结构的 Neo4j Cypher 查询

Neo4j Spatial,索引和图层之间的关系