Neo4J запрос для наиболее распространенных отношений - PullRequest
2 голосов
/ 17 октября 2019

Я изучаю информатику и сейчас работаю над проектом. Мне пришлось выбрать одну структуру данных NOSQL и изучить ее самостоятельно. Я выбрал базы данных Graph и сделал небольшой проект, чтобы показать свои навыки. Мне пришлось построить базу данных в Neo4J на основе реляционной базы данных.

Проект ориентирован на велосипеды, которые вы можете использовать и сдавать на разных станциях в окрестностях города Антверпен. Что-то, что есть в большинстве крупных городов. В моей базе данных есть 3 типа узлов. Прежде всего, есть аттракционы. Поездка состоит из идентификатора поездки, начального времени, конечного времени, начального идентификатора и конечного идентификатора. Тогда есть станции, где можно поставить велосипеды. У каждой поездки есть стартовая и конечная блокировка. Таким образом, есть также 2 типа отношений между этими узлами. Тот, куда уходит поездка, и тот, куда он прибывает. Станция состоит из идентификатора замка, улицы и номера (номер дома). Каждая станция находится в определенном районе Антверпена. районы состоят только из имени. В базе данных всего 7 округов.

Есть определенные запросы, которые мне пришлось написать, чтобы показать свои навыки в Neo4J, но есть один, который я просто не могу найти. Вопрос задается: «Какие районы имеют наибольшее количество поездок между ними?».

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

MATCH (d1:District)<--(s1:Station)<--(r:Ride)-->(s2:Station)-->(d2:District) 
WHERE d1.Name <> d2.Name 
RETURN d1, d2

Я искал в Интернете, и я пытался с COUNT (), ORDER BY () и COLLECT (), но, похоже, не может найти решение или приблизиться к нему. У кого-нибудь есть идеи, как я могу рассчитать наиболее распространенную связь между районами?

1 Ответ

0 голосов
/ 17 октября 2019

Ваш запрос выглядит так, как будто он почти готов, шаблон, который вы ищете, верен.

Вам понадобится лучший предикат, чтобы гарантировать, что вы не получите зеркальные результаты (результаты для тех же паррайоны, просто переключая, какой из них связан с d1, а какой связан с d2). Вы можете сделать это, добавив ограничение на графические идентификаторы районов: WHERE id(d1) < id(d2). Это также позволит избежать путей назад в тот же район.

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

MATCH (d1:District)<--(:Station)<--(r:Ride)-->(:Station)-->(d2:District) 
WHERE id(d1) < id(d2) 
RETURN d1, d2, count(r) as rideCount
ORDER BY rideCount DESC
LIMIT 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...