Neo4j cypher - однонаправленный и двунаправленный в одном запросе отношений? - PullRequest
0 голосов
/ 23 января 2019

У меня есть ситуация, когда мне нужно сопоставить путь переменной длины для одного типа отношений A или другого типа отношений B. Однако тип отношения A является двунаправленным, тогда как тип отношения B является однонаправленным.

например. Если бы оба типа отношений были двунаправленными, я мог бы использовать следующий оператор сопоставления:

MATCH (:Something {property: "value"}) -[:A|B*]- (n:Something)

Но так как тип отношения B является однонаправленным, мне нужно что-то вроде этого:

MATCH (:Something {property: "value"}) (-[:A]- OR <-[:B]-)* (n:Something)

Одно из решений, которое я мог бы использовать, - создать тип обратной связи для всех A как INVERSE_A и затем использовать:

MATCH (:Something {property: "value"}) <-[:A|INVERSE_A|B*]- (n:Something)

Но тогда мне нужно будет создать INVERSE_A для каждого A отношения, и это усложнит ситуацию для этого одного запроса.

Есть ли более понятный способ объединить однонаправленные и двунаправленные отношения в одном операторе соответствия?

1 Ответ

0 голосов
/ 23 января 2019

Cypher в настоящее время ограничен таким образом.

Если у вас есть доступ к процедурам APOC , вы можете использовать процедуры расширителя пути , чтобы обеспечить взаимосвязи для расширения, с возможностью указать направление (или отсутствие) для каждый тип самостоятельно. Эта конкретная процедура дает пути, поэтому вы хотите получить последний узел пути .:

MATCH (start:Something {property: "value"})
CALL apoc.path.expand(start, 'A|<B', 'Something', 1, -1) YIELD path
// parameters are: (startNode, relationshipFilter, labelFilter, minLevel, maxLevel)
WITH last(nodes(path)) as n
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...