Neo4j:使用多个 CALL 子查询时出现重复的行

Neo4j: Duplicated rows when using multiple CALL subqueries

我需要一些帮助来为我的问题构建 Cypher 查询。

给定以下架构:

我想获取所有子节点(blue/yellow 节点)、父节点(黄色节点)以及它们所在位置(绿色节点)的相应属性(灰色节点)。基本上,最后有以下输出:

Parent (yellow node) Child (yellow/blue) Parent_property(gray) Child_property(gray)

为此,我使用 UNION 从相同列名下的黄色和蓝色节点获取 parent_ids/child_ids,并构建了 2 个单独的 CALL 子查询(一个用于获取 id 信息,另一个用于 属性 信息)。但是,我不知道下一步如何进行,因为我在执行密码查询后获得了重复的信息。我知道这是由于 CALL 子查询的工作方式造成的,但是,我不知道如何解决这个问题。

//Fetch all parent and children ids
CALL { 
    MATCH (c:subPart)<-[:Has_child]-(p:mainPart{id: "12345"}) RETURN c.id AS child, p.id AS parent
    UNION
    MATCH (m:mainPart)<-[:Has_child]-(p:mainPart {id: "12345"}) RETURN m.id AS child, p.id AS parent
   
} 
//Get property info
MATCH (p)-[]->(r)-[:Has_property]->(property1) 
CALL {
    MATCH (c)-[]->(k)-[:Has_property]->(property2) RETURN property2.name AS child_property
    UNION
    MATCH (m)-[]->(n)-[:Has_property]->(property3) RETURN property3.name AS child_property
}
RETURN child, parent, property1.name AS parent_property, child_property

我也曾尝试收集列表中的父/子 ID 和属性,然后展开它们,或使用 WHERE EXISTS{} 子句来过滤属性,但是 none 这行得通。

我使用的是 Neo4j Desktop 4.3.3 版本。

任何 help/tips 将不胜感激!谢谢!

P.S:

这是一个代表我的真实数据结构的模拟数据集

CREATE
 (c: subPart {id: "80"}),
 (p: mainPart {id: "12345"}),
 (m: mainPart {id: "11234"}),
 (k: location {name: "Loc1"}),
 (r: location {name: "Loc2"}),
 (property1: property {name:"X"}),
 (property2: property {name:"Y"}),


 (c)<-[:Has_child]-(p),
 (m)<-[:Has_child]-(p),
 (c)-[:Has_location]->(k),
 (p)-[:Has_location]->(r),
 (m)-[:Has_location]->(r),
 (r)-[:Has_property]->(property1),
 (k)-[:Has_property]->(property2)

上面的代码应该输出如下图:

我想要的输出是:

Parent Child Parent_property Child_property
12345 80 X Y
12345 11234 X X

我真的希望这现在更有意义!谢谢!

执行此操作的最佳方法如下:

// get the parents and children
MATCH (p)-[:Has_child]->(c)
// for each combination of p and c, use pattern comprehension 
// to get the parent and child properties
WITH p,c,
       [(p)-->(:location)-->(p_prop:property) | p_prop.name][0] as p_prop,
       [(c)-->(:location)-->(c_prop:property) | c_prop.name][0] as c_prop
// return the result
RETURN p.id,c.id,p_prop,c_prop

正在退货

╒═══════╤═══════╤════════╤════════╕
│"p.id" │"c.id" │"p_prop"│"c_prop"│
╞═══════╪═══════╪════════╪════════╡
│"12345"│"80"   │"X"     │"Y"     │
├───────┼───────┼────────┼────────┤
│"12345"│"11234"│"X"     │"X"     │
└───────┴───────┴────────┴────────┘

有关模式理解的更多信息:https://neo4j.com/docs/cypher-manual/current/syntax/lists/#cypher-pattern-comprehension