如何将多个关系匹配到不同的节点?

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"}]            │
└──────────────────┴────────────────────────────┴────────────────────────────┘