2014-09-30 72 views
0

我正在使用neo4j 2.1.4社区版。我创建了一些节点和关系如下。 enter image description here在单个密码查询中添加新节点和关系

现在我想acheive以下任务: 我有喜欢的ID,姓名,CREATED_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

那么如何在单个密码查询中查看所有这些事情?

感谢

回答

0

你应该尝试你的话翻译成一个查询,或先绘制在纸上或白板。

首先你要“匹配”一个节点,那么你为什么要从“MERGE”开始?

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

其次,你也许想连接到紫节点橙色节点和黄色的节点,因为你的新节点应该像parrallel,你也应该为你想给一个别名的关系后来修改的关系属性:

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) 

最后,您希望将关系属性状态和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 
+0

@ Christophe,在查询我写了MERGE为了创建一个新的节点。在上图中,我没有显示新创建的节点。我想要在第二级创建该节点。所以我想创建具有属性的节点。然后想要与一级和三级节点建立关系。这里橙色是1级,紫色级2,黄色级3,绿色级4。所以在创建新节点后,我将在2级中拥有2个prple节点。 – shree11 2014-10-01 04:49:45

+0

那么我的查询在第二个级别中创建了新的紫色节点,在橙色和黄色之间,我首先开始匹配原始紫色节点,原因有两个, 1.你在图中定义了一个明确的起点,所以没有全局图遍历导致更快的查询,2.你可以访问与紫色节点相关的橙色和黄色节点,所以你事先知道你的位置新节点应该连接。 – 2014-10-01 06:20:10

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'}) 

将此状态与活动状态关系合并到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

我从克里斯托弗的回答,他保留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 
相关问题