Я использую 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