Использование свойства в качестве метки края при создании отношения - PullRequest
1 голос
/ 04 февраля 2020

У меня следующий запрос Neo4j:

UNWIND [{s:"a"}, {s:"b"}] AS x
WITH x

MATCH (y:Y {b:"hi"}), (z:Z {b:"hi"}) 
WITH y, z

MERGE (y)-[:x.s]->(z)

Идея состоит в том, чтобы использовать xs в качестве метки ребра между y и z. Но это приводит к следующей ошибке:

Neo.ClientError.Statement.SyntaxError: Неверный ввод '.': Ожидается символ идентификатора, пробел, '|', спецификация длины, карта свойства или ' ] '(строка 7, столбец 14 (смещение: 101)) "MERGE (y) - [: xs] -> (z)" ^

Каким будет соответствующий запрос для этого? Заранее спасибо

Ответы [ 3 ]

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

Прежде всего, вы теряете x во второй команде WITH. Во-вторых, вы не можете создать отношение с MERGE или CREATE, когда тип отношения фактически является значением переменной. Вы должны использовать apoc.create.relationship вместо:

UNWIND [{s:"a"}, {s:"b"}] AS x
WITH x

MATCH (y:Y {b:"hi"}), (z:Z {b:"hi"}) 
WITH y, z, x

CALL apoc.create.relationship(y, x.s, {},z) YIELD rel
RETURN *
1 голос
/ 04 февраля 2020

Используя PROFILE , вы должны увидеть, что для этого запроса требуется меньше обращений к БД:

MATCH (y:Y {b:"hi"}), (z:Z {b:"hi"})
UNWIND ["c", "d"] AS x
CALL apoc.create.relationship(y, x, {}, z) YIELD rel
RETURN y,z

Кроме того, вы должны создать индексов для :X(b) и :Z(b) для улучшения производительности.

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

Я обнаружил, что это можно сделать с помощью процедуры apoc.create.relationship:

UNWIND [{s:"c"}, {s:"d"}] AS x
WITH x

MATCH (y:Y {b:"hi"}), (z:Z {b:"hi"}) 
WITH y, z, x

CALL apoc.create.relationship(y, x.s, {}, z) YIELD rel
RETURN y,z

Я оставлю вопрос открытым на некоторое время, чтобы посмотреть, может ли кто-нибудь придумать лучший способ сделать это.

...