обход графа neo4j с условными типами ребер - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть фиксированная база данных, в которой есть узлы, соединяющие людей и ребра с шестью различными типами отношений.для простоты я называю в этом посте типы отношений A, B, C, D, E и F. Ни одно из отношений не является направленным.новый в синтаксисе, так что спасибо за помощь.

Мне нужно получить наборы отношений, которые пересекают граф на основе условного пути от A до (B или CD) к E к F. Так что это означает, что я сначалаМне нужны отношения, которые связывают два узла () - [: A] - (), но тогда я запутался в том, как выразить условные отношения.Чтобы перейти к следующему узлу, мне нужно либо B, либо C, а затем D, чтобы это было () - [: B] - () ИЛИ () - [: C] - () - [: D] - ().Как выразить этот условный обход в синтаксисе MATCH?

Попробовал все это и получил синтаксические ошибки:

(node2:Node)-[rel2:B|rel3:C]-(node3:Node)
(node2:Node)-[rel2:B]OR[rel3:C]-(node3:Node)

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Этот запрос чистого Cypher должен возвращать все подходящие пути:

MATCH p=()-[:A]-()-[r:B|C|D*1..2]-()-[:E]-()-[:F]-()
WHERE (SIZE(r) = 1 AND TYPE(r[0]) = 'B') OR
      (SIZE(r) = 2 AND TYPE(r[0]) = 'C' AND TYPE(r[1]) = 'D')
RETURN p

Шаблон [r:B|C|D*1..2] соответствует 1 или 2 отношениям, которые имеют типы B, C и / или * 1007.* (который может включать подпути, которые вам не нужны);и предложение WHERE отфильтровывает нежелательные подпути.

0 голосов
/ 10 декабря 2018

Это не то, что действительно можно выразить с помощью Cypher, когда количество прыжков, которые нужно пройти, не одинаково.

Самым простым способом сделать это, вероятно, было бы использование apoc.cypher.run () из процедур APOC для выполнения запроса UNION для охвата обоих путей, а затем работа с результатомЗвоните:

//assume `node2` is in scope
CALL apoc.cypher.run("MATCH (node2)-[:B]-(node3:Node) RETURN node3
 UNION
 MATCH (node2)-[:C]-()-[:D]-(node3:Node) RETURN node3",
 {node2:node2}) YIELD value
WITH value.node3 as node3 // , <whatever else you want in scope>
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...