Повторно использовать отношения в шифре с слиянием - PullRequest
1 голос
/ 08 февраля 2020

Со следующим графиком:

(Boxer)-[:STARTS]->(Round)-[:CONTINUES]->(Round)-[:CONTINUES]->(Round)-[:CONTINUES]->(Round)

Я хочу удалить (Раунд) в связанном списке.

Я получил успешный результат, выполнив это:

MATCH (round:Round {uuid: $round.uuid})
MATCH (prevRound)-[:CONTINUES]->(round)-[:CONTINUES]->(nextRound)
DETACH DELETE round
MERGE (prevRound)-[:CONTINUES]->(round)

Но это будет работать для любого Раунда, кроме первого, потому что он НАЧИНАЕТ отношения. Поэтому я попробовал это:

MATCH (round:Round {uuid: $round.uuid})
MATCH (prevRound)-[prevRel:CONTINUES|STARTS]->(round)-[nextRel:CONTINUES]->(nextRound)
DETACH DELETE round
MERGE (prevRound)-[prevRel]->(round)

Но я получаю эту ошибку:

Neo4jError: Variable `prevRel` already declared 
MERGE (prevRound)-[prevRel]->(nextRound)"

1 Ответ

1 голос
/ 08 февраля 2020

Вы не можете использовать идентификатор для динамического создания отношения в шифре.

В вашем утверждении планировщик считает, что вы пытаетесь использовать prevRel в качестве идентификатора в вашем MERGE, но он уже используется в MATCH выше.

К счастью, есть решение для этого с использованием APO C. Процедура apoc.merge.relationship может использоваться для создания нового типа отношений, такого же, как тот, который вы удалили при удалении раунда.

MATCH (round:Round {uuid: $round.uuid})
MATCH (prevRound)-[prevRel:CONTINUES|STARTS]->(round)-[nextRel:CONTINUES]->(nextRound)
DETACH DELETE round
WITH prevRound, prevRel, nextRound
CALL apoc.merge.relationship(prevRound, type(prevRel), {}, {}, nextRound) YIELD rel
RETURN prevRound, rel, nextRound
...