获取没有重复的Neo4j节点和关系数据

时间:2019-11-14 06:25:04

标签: neo4j

我有下面的图形,我想获得2个Task节点(即,两个显示日期的节点)。然后,我想获得WAS_BOUGHT关系,然后是MAKING_USE_OF关系。显然,我希望这些数据与匹配的给定任务相关。然后,我获取这些数据并在应用程序中创建一个Task对象,并将WAS_BOUGHT关系的列表和MAKING_USE_OF关系的列表存储为对象的属性。

groceries graph example

我尝试在下面运行查询,但是重复很多。每当关系数据到达时,我都会再次获得任务数据,重复一次。在将其解析到我的应用程序之前,我希望先对neo4j中已有的数据进行条件处理。我只是觉得这样会更有效率。

MATCH (t:Task)-[r1:WAS_BOUGHT]->()
MATCH (t:Task)-[r2:MAKING_USE_OF]->()
WHERE ID(t) IN [40,60]
RETURN t, r1, r2

我可以将其分为3个查询,以避免重复,但是这将需要3次与数据库的连接,这似乎效率很低。

MATCH (t:Task)-[]->()
WHERE ID(t) IN [40,60]
RETURN t

MATCH (t:Task)-[r1:WAS_BOUGHT]->()
WHERE ID(t) IN [40,60]
RETURN r1

MATCH (t:Task)-[r2:MAKING_USE_OF]->()
WHERE ID(t) IN [40,60]
RETURN r2

您知道如何编写查询以获取以下格式的数据而不重复吗?

任务节点,WAS_BOUGHT关系,ID = 40的MAKING_USE_OF关系

任务节点,WAS_BOUGHT关系,ID = 60的MAKING_USE_OF关系

1 个答案:

答案 0 :(得分:1)

每个Task节点都有一行

// find the specific task nodes and WAS_BOUGHT relatioships 
MATCH (t:Task)-[r1:WAS_BOUGHT]->()
WHERE ID(t) IN [40,60]

// aggregate the WAS_BOUGHT relationships per task
WITH t, collect(r1) AS bought

// with each task find what was used to shop
MATCH (t)-[r2:MAKING_USE_OF]->()

// return the task with the aggregate WAS_BOUGHT and MAKING_USE relationships
RETURN t, bought, collect(r2) AS making_use