如何创建查询以将多个数据与数字匹配

时间:2019-06-11 06:48:39

标签: neo4j cypher

我正在尝试根据数据库中给出的纬度和经度来查找每个地产是否靠近药房(即3公里之内)。如果遗产接近1,则查询完成后应返回遗产名称。应当指出,经纬度中的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 :(得分:0)

您应该使用Neo4j的本机spatial typesfunctions。它们是可索引的,因此,如果将坐标作为点类型参数保存在节点上并对其进行索引,则可以执行spatial index lookups by distance,这应该更易于与Cypher一起使用,并且性能更高。

因此,假设您在:Pharmacy和:Estate节点上具有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