Как получить все уникальные пути между двумя узлами? - PullRequest
0 голосов
/ 25 мая 2019

Я использую базу маршрутов треккинга и альпинизма и пытаюсь найти все возможные маршруты между Darjeeling и Sandakphu.

Это не проблема - вот запросдля этого:

MATCH allPaths=(town:town{name:'Darjeeling'})-[*]->(peak:peak{name:'Sandakphu'})
RETURN allPaths

Но этот запрос возвращает одни и те же маршруты несколько раз, например:

╒══════════════════════════════════════════════════════════════════════╕
│"allPaths"                                                            │
╞══════════════════════════════════════════════════════════════════════╡
│[{"name":"Darjeeling"},{"name":"Darjeeling-Rimbik","winter":"true","di│
│stance":15,"summer":"true"},{"name":"Rimbik"},{"name":"Rimbik"},{"name│
│":"Rimbik-Sirikhola","winter":"true","distance":4,"summer":"true"},{"n│
│ame":"Sirikhola"},{"name":"Sirikhola"},{"name":"Sirikhola-Gurdum","win│
│ter":"true","distance":6,"summer":"true"},{"name":"Gurdum"},{"name":"G│
│urdum"},{"name":"Gurdum-Sandakphu","winter":"true","distance":12,"summ│
│er":"true"},{"name":"Sandakphu","altitude":"12400 ft"}]               │
├──────────────────────────────────────────────────────────────────────┤
│[{"name":"Darjeeling"},{"name":"Darjeeling-Rimbik","winter":"true","di│
│stance":15,"summer":"true"},{"name":"Rimbik"},{"name":"Rimbik"},{"name│
│":"Rimbik-Sirikhola","winter":"true","distance":4,"summer":"true"},{"n│
│ame":"Sirikhola"},{"name":"Sirikhola"},{"name":"Sirikhola-Gurdum","win│
│ter":"true","distance":6,"summer":"true"},{"name":"Gurdum"},{"name":"G│
│urdum"},{"name":"Gurdum-Sandakphu","winter":"true","distance":12,"summ│
│er":"true"},{"name":"Sandakphu","altitude":"12400 ft"}]               │
├──────────────────────────────────────────────────────────────────────┤

Я пытался использовать DISTINCT на RETURN, как упоминалосьв документации

MATCH allPaths=(town:town{name:'Darjeeling'})-[*]->(peak:peak{name:'Sandakphu'})
RETURN DISTINCT allPaths

но, к сожалению, она не работает.

Ответы [ 2 ]

1 голос
/ 27 мая 2019

Neo4j не может возвращать один и тот же маршрут несколько раз, что не должно быть возможным. Пути должны быть разными, и тот же набор результатов при использовании RETURN DISTINCT allPaths подтверждает это.

EDIT

Используя тот же набор данных, я воссоздал это. Пути разные. Что сбивает с толку, так это то, что существует несколько отношений между одними и теми же наборами узлов (например, между Tumbling и Gairibus существует 3 отношения типов: trek,: road и: twowheeler), которые имеют одинаковые свойства.

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

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

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

Если вы хотите, чтобы пути игнорировали эти варианты отношений, ограничьте свой запрос: отношениями trek, так как они всегда присутствуют, когда два узла соединены:

MATCH path=(town:town{name:'Darjeeling'})-[:trek*]->(peak:peak{name:'Sandakphu'})
RETURN path

Возвращает только 6 возможных путей.

0 голосов
/ 26 мая 2019

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

match (town:town{name:'Darjeeling'})-[r]->(peak:peak{name:'Sandakphu'})
return distinct r

Кроме того, пока оно не применяется, в Neo4J принято создавать метки в UpperCamelCase (Townа не город, пик, а не пик).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...