Cypher динамическая связь с условной процедурой APOC?

Я изучаю шифр и пытаюсь найти способ создать динамические отношения, когда условие проходит. Вот пример:

у нас есть единственный узел:

(n2)

и другой узел, у которого неизвестные отношения TEMP_1 или TEMP_2 со своим дочерним узлом:

(n1) ------ [TEMP_1 или TEMP_2] ------> (дочерний)

мы хотим создать связь между (n2) и (дочерним), если она существует

(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, поэтому оно выглядит следующим образом:

(n2) - [r] -> (ребенок)

Есть ли способ создать динамические отношения при определенных условиях?

У меня есть другая идея, но для этого потребуется продолжить выполнение запроса, даже если MATCH ничего не возвращает.

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, он возвращается и не требует вызова процедуры APOC. Однако я хотел бы продолжить другую часть запроса, например. создавать другие отношения. Есть ли способ добиться чего-то подобного?


person kkris1983    schedule 12.03.2020    source источник


Ответы (1)


Функция 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 позже в запросе.

person cybersam    schedule 12.03.2020
comment
Это то, что я уже пробовал, с той лишь разницей, что RETURN rel отсутствовал во внутреннем apoc.create.relationship, и это вызвало ошибку, поэтому я предположил, что вызов процедур внутри запрещен. Спасибо за помощь :) - person kkris1983; 13.03.2020