我正在使用neo4j 2.1.4社区版。我创建了一些节点和关系,如下所示。
现在我想要完成以下任务:
我有一个节点(紫色节点),其中包含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查询中解决所有问题?
由于
答案 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