Как запросить расширенный путь между узлами с Cypher в Neo4J? - PullRequest
0 голосов
/ 06 февраля 2019

Я использую Neo4J / Cypher для хранения / извлечения некоторых данных, основанных на графической модели.

Давайте предположим следующую модель: у меня есть набор узлов (type = child), которые связаны черезотношение (type = CONNECTED_TO).

C1 -[:CONNECTED_TO]-> C2 -[:CONNECTED_TO]-> C3 -[:CONNECTED_TO]-> C4

Если я хочу запросить путь, начинающийся с C1 до C4, не зная промежуточных звеньев:

MATCH p=
  (a:child {id:'c1Id'}) -[:CONNECTED_TO*0..]-(z:child {id:'c4Id'}) 
RETURN p

Пока все хорошо.

Теперь предположим, что каждый дочерний элемент содержится в родительском элементе, и я хочу начать запрос с родительского идентификатора

P1 -[:CONTAINS]-> C1
P2 -[:CONTAINS]-> C2
P3 -[:CONTAINS]-> C3
P4 -[:CONTAINS]-> C4

Запрос выглядит так:

MATCH p=
        (a:parent {id:'p1Id'})
        -[:CONTAINS]->
        (cStart:child)
        -[:CONNECTED_TO*0..]-
        (cEnd:child)
        <-[Contains]-
        (z:parent {id:'p4Id'})
RETURN p

Это даст мне хорошеерезультат.Следующий путь:

P1 -[:CONTAINS]-> C1 -[:CONNECTED_TO]-> C2 -[:CONNECTED_TO]-> C3 -[:CONNECTED_TO]-> C4 <-[:CONTAINS]- P4

Я хотел бы запросить этот путь от P1 до P4, используя дочернюю топологию, но я хочу также извлечь всех родителей, содержащих промежуточные продукты.

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

P2 -[:CONTAINS]-> C2
P3 -[:CONTAINS]-> C3

Возможно ли это?Может быть, моя модель не подходит для этого варианта использования?В этом случае, как улучшить его для решения этого запроса?

Tx

1 Ответ

0 голосов
/ 06 февраля 2019

Вы можете использовать list comprehension конструкцию:

MATCH p=
        (a:parent {id:'p1Id'})
        -[:CONTAINS]->
        (cStart:child)
        -[:CONNECTED_TO*0..]-
        (cEnd:child)
        <-[Contains]-
        (z:parent {id:'p4Id'})
RETURN p,
       [n IN nodes(p)[1..-1] | (n)<-[:CONTAINS]-(:parent)][0]
...