Neo4j cyper заявка: Как да прекосявам

Опитвам се да науча neo4j, така че просто взех случай на използване на приложение за пътуване, за да науча, но не съм сигурен за оптималния начин за решаването му. Всяка помощ ще бъде оценена.

Благодаря предварително.

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

Две места са свързани чрез релация IS_CONNECTED релация. позовавайки се на зелени възли в изображението

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

въпросът ми е как да разберем, че трябва да сменим станцията от място б

Моето разбиране е:

  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().

Едно последно нещо, което трябва да отбележите...когато определяте дали две местоположения са свързани, ако всичко, от което се нуждаете, е true или false, ако са свързани, можете да използвате функцията 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