如何将多个关系匹配到不同的节点?
How to match multiple relationships to different nodes?
我想要达到的目的
我试图在单独的列中获取传出关系的节点。结果数据应如下所示:
node1
nodeRel1
nodeRel2
{...}
[{...}, {...}, ...]
[{...}, {...}, ...]
{...}
[{...}, {...}, ...]
[{...}, {...}, ...]
其中node1
是标签为Label1
的起始节点,nodeRel1
是通过REL1
连接到node1
的所有节点,标签为[=17] =]和nodeRel2
是通过REL2
连接到node1
的所有节点,标签为Label3
.
编辑:
具体来说,这对于像这样的两个关系是非常可行的(正如@nimrod serok 所指出的):MATCH ()-[]-(origin)-[]-()
,但这只适用于两个关系。这需要扩展到三个,五个,任意数量。
我试过的
我尝试的第一件事是:
MATCH (node1:Label1)-[:REL1|:REL2]->(node2)
RETURN node1, collect(node2)
收集 node2
会将不同标签的结果合并到一个列表中的一列下,这样是行不通的。
解释了为什么使用多个匹配项不起作用。 (TLDR:它变成了 AND
条件,而不是我正在寻找的 OR
类型。
编写两个单独的查询并使用 UNION
组合它们是行不通的,因为根据 docs,联合需要 RETURN
结构相同。在我的例子中,第一个查询看起来像 RETURN node1, collect(nodeRel1)
,第二个像 RETURN node1, collect(nodeRel2)
,它们属于不同的类型。
现在怎么办?
我认为我可以通过使用 RETURN
实现这一点,如下所示:
RETURN node1, collect(nodeRel1), collect(nodeRel2)
然而,现在我在编写 MATCH
子句时感到很迷茫。什么查询会给我所需的数据?同样重要的是,为什么?
提前致谢,
尼尔斯
这里有几个选项,其中之一是:
MATCH
原始节点,然后 OPTIONAL MATCH
您需要哪种关系类型(因为它不是强制存在的)。最后一部分是collect
每个类型的节点
MATCH (n:Person)
WITH n
OPTIONAL MATCH (n)-[:LIKES]-(m)
WITH n, m
OPTIONAL MATCH (n)-[:LOVES]-(t)
RETURN n, collect(distinct(m)) as likes, collect(distinct(t)) as loves
对于此示例数据:
MERGE (b:Person {name: "Bob" })
MERGE (c:Person {name: "Charles" })
MERGE (a:Person {name: "Anna" })
MERGE (d:Person {name: "Kira" })
MERGE (e:Person {name: "Dan" })
MERGE (f:Person {name: "El" })
MERGE (a)-[:LIKES]-(b)
MERGE (a)-[:LIKES]-(c)
MERGE (a)-[:LIKES]-(d)
MERGE (e)-[:LOVES]-(a)
MERGE (e)-[:LOVES]-(b)
MERGE (f)-[:LOVES]-(a)
MERGE (d)-[:LOVES]-(b)
MERGE (f)-[:LOVES]-(a)
它给了我这个:
╒══════════════════╤════════════════════════════╤════════════════════════════╕
│"n" │"likes" │"loves" │
╞══════════════════╪════════════════════════════╪════════════════════════════╡
│{"name":"Dan"} │[] │[{"name":"Bob"},{"name":"Ann│
│ │ │a"}] │
├──────────────────┼────────────────────────────┼────────────────────────────┤
│{"name":"El"} │[] │[{"name":"Anna"}] │
├──────────────────┼────────────────────────────┼────────────────────────────┤
│{"name":"Bob"} │[{"name":"Anna"}] │[{"name":"Dan"},{"name":"Kir│
│ │ │a"}] │
├──────────────────┼────────────────────────────┼────────────────────────────┤
│{"name":"Charles"}│[{"name":"Anna"}] │[] │
├──────────────────┼────────────────────────────┼────────────────────────────┤
│{"name":"Anna"} │[{"name":"Charles"},{"name":│[{"name":"El"},{"name":"Dan"│
│ │"Kira"},{"name":"Bob"}] │}] │
├──────────────────┼────────────────────────────┼────────────────────────────┤
│{"name":"Kira"} │[{"name":"Anna"}] │[{"name":"Bob"}] │
└──────────────────┴────────────────────────────┴────────────────────────────┘
我想要达到的目的
我试图在单独的列中获取传出关系的节点。结果数据应如下所示:
node1 | nodeRel1 | nodeRel2 |
---|---|---|
{...} | [{...}, {...}, ...] | [{...}, {...}, ...] |
{...} | [{...}, {...}, ...] | [{...}, {...}, ...] |
其中node1
是标签为Label1
的起始节点,nodeRel1
是通过REL1
连接到node1
的所有节点,标签为[=17] =]和nodeRel2
是通过REL2
连接到node1
的所有节点,标签为Label3
.
编辑:
具体来说,这对于像这样的两个关系是非常可行的(正如@nimrod serok 所指出的):MATCH ()-[]-(origin)-[]-()
,但这只适用于两个关系。这需要扩展到三个,五个,任意数量。
我试过的
我尝试的第一件事是:
MATCH (node1:Label1)-[:REL1|:REL2]->(node2)
RETURN node1, collect(node2)
收集 node2
会将不同标签的结果合并到一个列表中的一列下,这样是行不通的。
AND
条件,而不是我正在寻找的 OR
类型。
编写两个单独的查询并使用 UNION
组合它们是行不通的,因为根据 docs,联合需要 RETURN
结构相同。在我的例子中,第一个查询看起来像 RETURN node1, collect(nodeRel1)
,第二个像 RETURN node1, collect(nodeRel2)
,它们属于不同的类型。
现在怎么办?
我认为我可以通过使用 RETURN
实现这一点,如下所示:
RETURN node1, collect(nodeRel1), collect(nodeRel2)
然而,现在我在编写 MATCH
子句时感到很迷茫。什么查询会给我所需的数据?同样重要的是,为什么?
提前致谢, 尼尔斯
这里有几个选项,其中之一是:
MATCH
原始节点,然后 OPTIONAL MATCH
您需要哪种关系类型(因为它不是强制存在的)。最后一部分是collect
每个类型的节点
MATCH (n:Person)
WITH n
OPTIONAL MATCH (n)-[:LIKES]-(m)
WITH n, m
OPTIONAL MATCH (n)-[:LOVES]-(t)
RETURN n, collect(distinct(m)) as likes, collect(distinct(t)) as loves
对于此示例数据:
MERGE (b:Person {name: "Bob" })
MERGE (c:Person {name: "Charles" })
MERGE (a:Person {name: "Anna" })
MERGE (d:Person {name: "Kira" })
MERGE (e:Person {name: "Dan" })
MERGE (f:Person {name: "El" })
MERGE (a)-[:LIKES]-(b)
MERGE (a)-[:LIKES]-(c)
MERGE (a)-[:LIKES]-(d)
MERGE (e)-[:LOVES]-(a)
MERGE (e)-[:LOVES]-(b)
MERGE (f)-[:LOVES]-(a)
MERGE (d)-[:LOVES]-(b)
MERGE (f)-[:LOVES]-(a)
它给了我这个:
╒══════════════════╤════════════════════════════╤════════════════════════════╕
│"n" │"likes" │"loves" │
╞══════════════════╪════════════════════════════╪════════════════════════════╡
│{"name":"Dan"} │[] │[{"name":"Bob"},{"name":"Ann│
│ │ │a"}] │
├──────────────────┼────────────────────────────┼────────────────────────────┤
│{"name":"El"} │[] │[{"name":"Anna"}] │
├──────────────────┼────────────────────────────┼────────────────────────────┤
│{"name":"Bob"} │[{"name":"Anna"}] │[{"name":"Dan"},{"name":"Kir│
│ │ │a"}] │
├──────────────────┼────────────────────────────┼────────────────────────────┤
│{"name":"Charles"}│[{"name":"Anna"}] │[] │
├──────────────────┼────────────────────────────┼────────────────────────────┤
│{"name":"Anna"} │[{"name":"Charles"},{"name":│[{"name":"El"},{"name":"Dan"│
│ │"Kira"},{"name":"Bob"}] │}] │
├──────────────────┼────────────────────────────┼────────────────────────────┤
│{"name":"Kira"} │[{"name":"Anna"}] │[{"name":"Bob"}] │
└──────────────────┴────────────────────────────┴────────────────────────────┘