Как создать запрос для сопоставления нескольких данных с числами - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь выяснить, находится ли каждое поместье рядом с аптекой или нет (то есть в пределах 3 км) на основе широты и долготы, указанных в базе данных. Если имущество близко к одному, имя имущества должно быть возвращено после выполнения запроса. Следует отметить, что 1 в широте / длине считается 1 км. Я пытался сделать это, используя теорему Пифагора с использованием шифра, но безуспешно. Я пробовал этот запрос и несколько вариантов, кроме того, но, похоже, ни один из них не работает.

MATCH (n), (p)
WHERE n:Estate AND p:Pharmacy AND ((sqrt(((n.Latitude -p.Latitude)*(n.Latitude -p.Latitude))
     +((n.Longitude-p.Longitude)*(n.Longitude-p.Longitude)))<3 AND NOT null) 
     OR (sqrt(((p.Latitude -n.Latitude) *(p.Latitude -n.Latitude))
     +((p.Longitude-n.Longitude)*(p.Longitude-n.Longitude)))<3 AND NOT null))
     RETURN distinct n.Name


CREATE (Estate1:Estate{ Name: "Estate1",Longitude : 1, Latitude: 1, Area: 80, Floor: 5, Elevator: true, Price: 1500})
RETURN Estate1

CREATE (Estate2:Estate{ Name: " Estate2",Longitude : 3, Latitude: 4, Area: 120, Floor: 2, Elevator: false, Price: 2200})
RETURN Estate2

CREATE (Estate3:Estate{ Name: " Estate3",Longitude : 7, Latitude: 3, Area: 200, Floor: 3, Elevator: true, Price: 1000})
RETURN Estate3

CREATE (Estate4:Estate{ Name: " Estate4",Longitude : 9, Latitude: 1, Area: 72, Floor: 4, Elevator: false, Price: 2500 })
RETURN Estate4


CREATE (Pharmacy1:Pharmacy{ Name: "Pharmacy1", Longitude : 4, Latitude: 3})

CREATE (Pharmacy2:Pharmacy{ Name: "Pharmacy2", Longitude : 14, Latitude: 2})

CREATE (Pharmacy3:Pharmacy{ Name: "Pharmacy3", Longitude : 9, Latitude: 7})

1 Ответ

0 голосов
/ 11 июня 2019

Вместо этого вы должны использовать собственные пространственные типы и функций Neo4j.Они индексируются, поэтому, если вы сохраняете координаты в качестве параметра типа точки на своих узлах и индексируете их, вы можете выполнить поиск пространственного индекса по расстоянию , который должен быть как более простым в использовании с Cypher, так и более производительным.

Итак, предполагая, что у вас есть свойство пространственной точки location на ваших: Аптеках и: Узлах недвижимости и индексы на обоих, вы можете использовать следующее для индексированного поиска состояний по расстоянию (в метрах) отаптека:

MATCH (e:Estate)
WITH e.location as estateLocation
MATCH (p:Pharmacy)
WHERE distance(p.location, estateLocation) < 3000
WITH DISTINCT e
RETURN e.name as estate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...