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
我需要一些帮助来为我的问题构建 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