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
。
我正在学习密码学,并试图找到一种在条件通过时创建动态关系的方法。 这是一个例子:
我们只有一个节点:
(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
。