Запрос Neo4j cyper: как пройти

Я пытаюсь изучить neo4j, поэтому я просто взял пример использования приложения для путешествий, чтобы узнать, но я не уверен в оптимальном способе его решения. Любая помощь будет оценена.

Заранее спасибо.

Итак, рассмотрим вариант использования, в котором мне нужно ехать из одного места (МЕСТО A) в другое (МЕСТО C) на поезде, но прямой связи между ними нет. места. Итак, нам нужно пересесть на МЕСТО B.

Два места связаны отношением IS_CONNECTED. отсылка к зеленым узлам на изображении

И затем, если между двумя точками существует отношение is_connected, тогда будет исходящая связь, т. е. CONNECTED_VIA, к общему поезду из обоих узлов, что подразумевает, как они связаны, ссылаясь на красные узлы в изображение

мой вопрос в том, как мы должны узнать, что мы должны изменить станцию ​​​​с места b

Мое понимание:

  1. Мы проверим, где два места связаны отношением IS_CONNECTED.

    match (start:place{name:"heidelberg"}), (end:place{name:"frankfurt"}) MATCH path = (start)-[:IS_CONNECTED*..]->(end) RETURN path

это покажет, что эти два места связаны

  1. Тогда мы увидим, что если точка A и точка c связаны напрямую или нет запросом

    match (p:place{name:"heidelberg"})-[:CONNECTED_VIA]->(q)‹-[:CONNECTED_VIA]-(t:place{name:"frankfurt"}) return q

И это ничего не вернет, потому что нет прямых соединений

  1. Мой мозг перестал работать после этого. Я пытаюсь понять, как за последние 3 дня. Извините, я выгляжу сбитым с толку

Пожалуйста, нажмите здесь, чтобы увидеть изображение того, что я имею в виду


person Ankit Chaurasia    schedule 15.02.2017    source источник


Ответы (1)


Вы захотите использовать отношения переменной длины в вашем совпадении :CONNECTED_VIA, а затем получить узлы :Place, которые находятся на вашем пути. И обычно хорошей идеей является использование верхней границы, независимо от того, что имеет смысл на вашем графике.

Затем мы можем использовать фильтр для узлов на вашем пути, чтобы сохранить только те, которые являются узлами :Place.

match path = (p:place{name:"heidelberg"})-[:CONNECTED_VIA*..4]-(t:place{name:"frankfurt"}) 
return path, [node in nodes(path)[1..-1] where node:Place] as connectionPlaces

И если вас интересуют только самые короткие пути, вы можете проверить функции ShortestPath() или ShortestPaths().

И последнее, на что следует обратить внимание... при определении того, связаны ли два местоположения, если все, что вам нужно, это истина или ложь, если они связаны, вы можете использовать функцию EXISTS(), чтобы вернуть, существует ли такой шаблон:

match (start:place{name:"heidelberg"}), (end:place{name:"frankfurt"}) 
return exists((start)-[:IS_CONNECTED*..5]->(end))
person InverseFalcon    schedule 15.02.2017
comment
Большое тебе спасибо !! это то, что я искал - person Ankit Chaurasia; 15.02.2017