在单个cypher查询中添加新节点和关系

时间:2014-09-30 11:54:08

标签: neo4j cypher

我正在使用neo4j 2.1.4社区版。我创建了一些节点和关系,如下所示。enter image description here

现在我想要完成以下任务: 我有一个节点(紫色节点),其中包含ID,Name,Created_Date和End_Date等属性。它的关系属性为flag:ACTIVE 1)我想在橙色节点下方和黄色节点上方添加一个节点,即新创建的节点将像紫色节点的并行节点,橙色和黄色节点之间具有HAS关系,并且具有关系财产Status:ACTIVE。 3)现有的紫色颜色节点关系属性Status:'ACTIVE'也应该更改为INACTIVE,紫色颜色节点的END_Date应该成为新创建的节点Created_Date

这些我想在单个查询中实现的所有内容。

我写了下面的查询来实现这个目的。我能够使用created_date创建一个新节点,但无法创建关系。我不知道它出了什么问题。

查询:

MERGE  (og:OperatingGroup {OperatingGroup_ID:'NOP',OpeartingGroup_Name:'Operating'}) 
ON CREATE SET og.GOG_Start_Date= timestamp()
WITH og
MATCH (h:Hierarchy {Hierarchy_ID:181,Hierarchy_Name:'Global Property Hierarchy'})
Create (h)-[:HAS]->(og)
return h,og;

上述查询中未实现的内容是: 1)与财产建立关系 2)更新旧节点中的END_Date(紫色节点) 3)将旧节点的关系属性更新为INACTIVE

那么如何在单个cypher查询中解决所有问题?

由于

2 个答案:

答案 0 :(得分:0)

您应该尝试将单词翻译成查询,或首先将其绘制在纸张或白板上。

首先你要" MATCH"一个节点,那你为什么要开始" MERGE" ?

MATCH (purple:Purple {id:123})
WITH purple

其次,您可能希望获得连接到Purple节点的橙色节点和黄色节点,因为您的新节点应该像并行一样,您还应该为关系提供别名,因为您要修改关系属性以后:

MATCH (orange:Orange)-[purpleToOrange:HAS]-(purple)-[purpleToYellow:HAS]-(yellow:Yellow)
WITH purple, orange, yellow, purpleToOrange, purpleToYellow

然后您需要创建新节点并将黄色和橙色节点附加到它,相关节点已经与查询绑定,因此您可以使用" MERGE"并避免重复的黄色和橙色节点:

MERGE (orange)-[:HAS]->(newPurple:Purple {id: 789654, created_at:20140930140925})<-[:HAS]-(yellow)

最后你要将关系属性status和end_date从原始的紫色节点更新到?? (未在说明中指明,因此我假设在紫色和橙色之间)

SET purpleToOrange.status = "INACTIVE",
SET purpleToOrange.endDate = 20140930140925

然后你可能想要返回你新创建的紫色节点:

RETURN newPurple

现在完整的查询:

MATCH (purple:Purple {id:123})
WITH n
MATCH (orange:Orange)-[purpleToOrange:HAS]-(purple)-[purpleToYellow:HAS]-(yellow:Yellow)
WITH purple, orange, yellow, purpleToOrange, purpleToYellow
MERGE (orange)-[:HAS]->(newPurple:Purple {id: 789654, created_at:20140930140925})<-[:HAS]-(yellow)
SET purpleToOrange.status = "INACTIVE",
SET purpleToOrange.endDate = 20140930140925
RETURN newPurple

答案 1 :(得分:0)

你想用一个查询做很多事情,但我认为这样做会:

MATCH (h:Hierarchy {Hierarchy_ID:181,Hierarchy_Name:'Global Property Hierarchy'})
MERGE (h)-[:HAS{status;'ACTIVE'}]->(og:OperatingGroup {OperatingGroup_ID:'NOP',OpeartingGroup_Name:'Operating'})
ON CREATE SET og.GOG_Start_Date = timestamp()
WITH h, og
MATCH (h)-[has:HAS{status:'ACTIVE'}]->(other:OperatingGroup)
WHERE other <> og
SET has.status='INACTIVE'
SET other.GOG_End_Date = og.GOG_Start_Date
RETURN h, og

将Hierarchy节点与所有内容相关联。

MATCH (h:Hierarchy {Hierarchy_ID:181,Hierarchy_Name:'Global Property Hierarchy'})

将其与ActiveGroup状态关系合并到具有ID“NOP”的OperatingGroup。

MERGE (h)-[:HAS{status;'ACTIVE'}]->(og:OperatingGroup {OperatingGroup_ID:'NOP',OpeartingGroup_Name:'Operating'})

如果刚刚创建了该组,则设置开始日期。

ON CREATE SET og.GOG_Start_Date = timestamp()

现在匹配现有的任何其他OperatingGroup及其HAS关系。根据请求设置status属性和endDate(在OperatingGroup节点上,以匹配GOG_Start_Date?)。

WITH h, og
MATCH (h)-[has:HAS]->(other:OperatingGroup)
WHERE other <> og
SET has.status='INACTIVE'
SET other.GOG_End_Date = og.GOG_Start_Date
RETURN h, og

编辑 - 运营公司

我从Christophe的回答中看到他保留了OperatingGroup与OperatingCOmpany的关系,虽然没有请求确实很有意义(我们是否颠倒了你的图表?)。

MATCH (h:Hierarchy {Hierarchy_ID:181,Hierarchy_Name:'Global Property Hierarchy'})-[existingHas:HAS]->(existingOg:OperatingGroup)<-[belong:BELONGS]-(company:OperatingCompany)
MERGE (h)-[:HAS{status;'ACTIVE'}]->(og:OperatingGroup {OperatingGroup_ID:'NOP',OpeartingGroup_Name:'Operating'})<-[:BELONGS]-(company)
ON CREATE SET og.GOG_Start_Date = timestamp()
WITH h, og, existingHas, exitingOg
SET existingHas.status='INACTIVE'
SET existingOg.GOG_End_Date = og.GOG_Start_Date
RETURN h, og