Neo4j: запрос пути между двумя узлами в определенном порядке отношений и знание только метки последнего узла - PullRequest
0 голосов
/ 26 апреля 2018

Например, если у меня сложный граф, имеющий следующие метки и отношения:

N1-а-> Н2-b-> N3-C-> N4

N-2-d-N5-е-> N 3

и т.д.

Теперь я хочу найти путь от (: N1 {id: 'xyz'}) к любому узлу типа N4 с использованием Cypher, но я хочу, чтобы отношения были в том же порядке, т.е. а, б, в.

Кроме того, если нет узлов типа N3, соединяющихся с узлом типа N4, я хотел бы возвращать путь до N3

Мне было интересно, есть ли способ сделать это. Может кто-нибудь, пожалуйста, помогите? Я новичок в Neo4j

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Для использования расширителя пути APOC, при условии, что вы используете одну из версий APOC от Winter 2018 или новее, вы можете воспользоваться новой функцией последовательностей, которая позволяет вам определять повторяющуюся последовательность меток узлов и типов отношений. В этом случае мы ограничим повторение параметром конфигурации maxLevel.

MATCH (start:N1{id:'xyz'})
CALL apoc.path.expandConfig(start, {sequence:'N1, a>, N2, b>, N3, c>, N4', maxLevel:3}) YIELD path
RETURN path
ORDER BY length(path) DESC
LIMIT 1

Если вам не нужны (или вы не знаете) метки в пути (за исключением последней метки N4), вы можете использовать * для меток, например:

sequence:'*, a>, *, b>, *, c>, N4'

0 голосов
/ 26 апреля 2018

Если вы явно знаете отношения для прохождения, то вы сможете сделать это с Cypher, хотя ваше условие вернуть N3, если N4 отсутствует, может быть сложным.

Известен ли ярлык N3, или вы просто хотите, чтобы этот путь был максимально длинным? Кроме того, если узлы метки N4 встречаются вдоль пути, а не только в конце, они вам тоже нужны или вас интересует только N4 в конце цепочки отношений?

Кроме того, вас интересуют все возможные пути или вам нужен только один путь, если он существует?

Этот запрос должен работать, если вы явно знаете (и можете определить в запросе) отношения для прохождения, и если вам нужен только один путь, если он существует, и если вас интересует только узел метки N4 в конец (или узел перед этим, если в конце нет N4):

MATCH p=(:N1{id:'xyz'})-[:a]->()-[:b]->()-[:c*0..1]->(last)
WHERE length(p) = 3 and last:N4 OR length(p) = 2
WITH p
ORDER BY length(p) DESC
LIMIT 1
RETURN p

Если критерии более сложные, для этого могут потребоваться процедуры расширителя пути APOC.

...