我使用的是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)更新旧节点(紫色节点)中的关系3)将旧节点的END_Date属性更新为INACTIVE
那么,如何在一个密码查询中访问所有这些内容呢?
谢谢
发布于 2014-09-30 12:16:02
您应该尝试将您的单词转换为查询,或者首先将其绘制在纸上或白板上。
首先,你想“匹配”一个节点,那么为什么要从"MERGE“开始呢?
MATCH (purple:Purple {id:123})
WITH purple
其次,您可能想要获取连接到Purple Node的橙色节点和黄色节点,因为您的新节点应该类似于平行的节点,所以您还应该为关系指定一个别名,因为您希望稍后修改关系属性:
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
发布于 2014-09-30 12:22:43
您想要用一个查询做很多事情,但我认为这样就可以了:
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
匹配从中踢出所有内容的层次结构节点。
MATCH (h:Hierarchy {Hierarchy_ID:181,Hierarchy_Name:'Global Property Hierarchy'})
将此与活动状态关系合并到ID为'NOP‘的OperatingGroup。
MERGE (h)-[:HAS{status;'ACTIVE'}]->(og:OperatingGroup {OperatingGroup_ID:'NOP',OpeartingGroup_Name:'Operating'})
如果组是刚创建的,则设置开始日期。
ON CREATE SET og.GOG_Start_Date = timestamp()
现在匹配任何其他已存在的OperatingGroups和它们的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
编辑- OperatingCompany
我从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
https://stackoverflow.com/questions/26120196
复制