Cypher 与条件 APOC 程序的动态关系?

Cypher dynamic relationship with conditional APOC procedure?

我正在学习密码学,并试图找到一种在条件通过时创建动态关系的方法。 这是一个例子:

我们只有一个节点:

(n2)

和另一个节点与它的子节点有 TEMP_1 或 TEMP_2 的未知关系:

(n1)------[TEMP_1 或 TEMP_2]------>(子)

我们想在 (n2) 和 (child) 之间创建关系(如果存在的话)

(n2)------[TEMP_1或TEMP_2]------>(子)

这里是查询:

MATCH (n1: NODE_1)
MATCH (n2: NODE_2)
OPTIONAL MATCH (n1)-[rel:TEMP_1|TEMP_2]->(child)
CALL apoc.do.when(child IS NOT NULL, "CREATE (n2)-[:r]->(ch) RETURN TRUE", "", {n2:n2, r:type(rel), ch:child}) YIELD value

然而,这为我创建了 "r" 类型的关系,而不是从 rel[= 中获取 type 47=] 所以它看起来像下面这样:

(n2)-[r]->(子)

有没有办法在特定条件下创建动态关系?

我有另一个想法,但这需要继续执行查询,即使 MATCH returns 什么都没有。

MATCH (n1: NODE_1)
MATCH (n2: NODE_2)
MATCH (n1)-[rel:TEMP_1|TEMP_2]->(child)
CALL apoc.do.when(child IS NOT NULL, "CREATE (n2)-[:r]->(ch) RETURN TRUE", "", {n2:n2, r:type(rel), ch:child}) YIELD value
...[other parts of query e.g. MATCH | CREATE ...]

这次没有可选匹配,当子项为 NULL 时,它 returns 并且不会调用 APOC 过程。但是我想继续查询的其他部分,例如建立其他关系。有没有办法完成这样的事情?

apoc.create.relationship 函数可以创建动态类型的关系。

此外,引用参数时需要使用“$”前缀。

例如:

OPTIONAL MATCH (n1: NODE_1)-[rel:TEMP_1|TEMP_2]->(child)
CALL apoc.do.when(
  child IS NOT NULL,
  "MATCH (n2: NODE_2) CALL apoc.create.relationship(n2, $r, $ch) YIELD rel RETURN rel",
  "",
  {r:type(rel), ch:child}) YIELD value
...

此代码段仅在需要时获取 n2,假设您稍后在查询中不需要 n2