【问题标题】:Create new relationships from the result of a query neo4j从查询 neo4j 的结果创建新关系
【发布时间】:2019-05-05 17:39:48
【问题描述】:

我想从一个节点和一组节点之间的最短路径的结果中建立新的关系。我目前正在使用此查询来执行此类任务,但在两个节点之间(效果很好):

MATCH
  (p1:Category {catName: "Main_topic_classifications"}), 
  (p2:Category {catName: "Monarchs_of_the_Bulgars"}),
  path = allShortestPaths((p2)-[:SUBCAT_OF*]->(p1))
UNWIND RELATIONSHIPS(path) AS rel
WITH STARTNODE(rel) AS s, ENDNODE(rel) AS e
MERGE (s)-[:NEW_SUBCAT]->(e)

我如何概括此查询以返回 p2 ("Monarchs_of_the_Bulgars") 和节点列表 p1 = ["Health", "History", "Humanity"] 之间的 allshortestPaths 列表,而不是像上一个查询?

感谢您的帮助。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    这应该可行:

    MATCH (p1:Category)
    WHERE p1.category IN ["Health", "History", "Humanity"]
    MATCH
      (p2:Category {catName: "Monarchs_of_the_Bulgars"}),
      path = allShortestPaths((p2)-[:SUBCAT_OF*]->(p1))
    UNWIND RELATIONSHIPS(path) AS rel
    WITH STARTNODE(rel) AS s, ENDNODE(rel) AS e
    MERGE (s)-[:NEW_SUBCAT]->(e)
    

    [更新]

    如果p1 也必须是Top_Main_Classification 的直接子目录,那么您可以这样做:

    MATCH (p1:Category)-[:SUBCAT_OF]->(main:Category {catName: "Main_topic_classifications"})
    WHERE p1.category IN ["Health", "History", "Humanity"]
    MERGE (p1)-[:NEW_SUBCAT]->(main)
    MATCH
      (p2:Category {catName: "Monarchs_of_the_Bulgars"}),
      path = allShortestPaths((p2)-[:SUBCAT_OF*]->(p1))
    UNWIND RELATIONSHIPS(path) AS rel
    WITH STARTNODE(rel) AS s, ENDNODE(rel) AS e
    MERGE (s)-[:NEW_SUBCAT]->(e)
    

    【讨论】:

    • 感谢您的帮助。我可以在返回的路径上再施加一个条件,其中*节点(健康、历史等)必须连接到*主分类节点,即 (p1)-> (Top_Main_Classification)?
    • 我修改了我的更新以在p1 节点和“主”节点之间创建NEW_SUBCAT 关系。