【问题标题】:Adding new node and relationship in a single cypher query在单个密码查询中添加新节点和关系
【发布时间】:2014-09-30 11:54:08
【问题描述】:

我使用的是 neo4j 2.1.4 社区版。我创建了一些节点和关系如下。

现在我想要完成以下任务: 我有一个具有 ID、名称、Created_Date 和 End_Date 等属性的节点(紫色节点)。它的关系属性为flag:ACTIVE 1)我想在橙色节点下方和黄色节点上方添加一个节点,即新创建的节点将类似于具有HAS关系的紫色节点的平行节点,橙色和黄色节点之间具有关系属性@ 987654324@。 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

那么如何在一个密码查询中完成所有这些事情呢?

谢谢

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    你应该试着把你的话翻译成一个查询,或者先把它画在纸或白板上。

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

    MATCH (purple:Purple {id:123})
    WITH 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)
    

    最后你想将关系属性状态和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
    

    【讨论】:

    • @ Christophe,在查询中我写了 MERGE 以创建一个新节点。在上图中,我没有显示新创建的节点。我希望在第二级创建该节点。所以我想创建具有属性的节点。然后想与一级和三级节点建立关系。这里橙色是1级,紫色-2级,黄色-3级,绿色-4级。因此,在创建新节点后,我将在 2 级拥有 2 个 prple 节点。
    • 好吧,我的查询在橙色和黄色之间准确地创建了您的新紫色节点,我首先从匹配原始紫色节点开始有两个原因,1.您在您的图,因此没有全局图遍历导致更快的查询,2.您可以访问与紫色节点相关的橙色和黄色节点,因此您可以提前知道新节点应该连接的确切位置。
    【解决方案2】:

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

    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 的 Active 状态关系合并。

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

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

    ON CREATE SET og.GOG_Start_Date = timestamp()
    

    现在匹配任何其他存在的操作组及其 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      相关资源
      最近更新 更多