OrientDB 中带有 sub-select 的根空间查询
rooted spatial query with sub-select in OrientDB
我正在尝试组合查询以查找图表中节点 2 公里以内的节点。假设我有一个数据集,它标记了来自纳斯卡线的一些地理符号:
Name,Latitude,Longitude
Hummingbird,-14.692131,-75.148892
Monkey,-14.706940,-75.138532
Condor,-14.697444,-75.126208
Spider,-14.694145,-75.122381
Spiral,-14.688277,-75.122746
Hands,-14.694459,-75.113881
Tree,-14.693898,-75.114520
Astronaut,-14.745222,-75.079755
Dog,-14.706401,-75.130788
Wing,-14.680309,-75.100385
Parrot,-14.689463,-75.107498
我使用以下方法创建了一个空间索引:
CREATE INDEX GeoGlyph.index.Location
ON GeoGlyph(Latitude,Longitude) SPATIAL ENGINE LUCENE
现在,我想找到 "Hands" 字形 2km 以内的节点,我可以通过手动输入 Lat/Long 坐标来输入此查询:
SELECT Name, Latitude, Longitude, $distance AS Distance
FROM GeoGlyph
WHERE [Latitude,Longitude,$spatial]
NEAR [-14.694459,-75.113884,{"maxDistance":2}]
ORDER BY Distance
我得到结果:
+----+------+----------+----------+--------------------+
|# |Name |Latitude |Longitude |Distance |
+----+------+----------+----------+--------------------+
|0 |Hands |-14.694459|-75.113884|5.230883384236603E-6|
|1 |Tree |-14.693897|-75.11446 |0.08836486627516459 |
|2 |Spider|-14.694363|-75.12358 |1.0442063409276094 |
|3 |Spiral|-14.688309|-75.12276 |1.1754176535538237 |
|4 |Condor|-14.698346|-75.128334|1.6149944044266815 |
+----+------+----------+----------+--------------------+
到目前为止,还不错。
由于输入坐标有点麻烦,我更愿意使用名称字段 "Hands" 查找 2 公里以内的字形。
这是我目前卡住的地方。我想我应该能够使用 LET block 来获得我想要的东西......但是我到目前为止所尝试的是行不通的:
SELECT *,$distance AS Distance
FROM GeoGlyph
LET $temp = (SELECT * FROM GeoGlyph WHERE Name = "Hands")
WHERE [Latitude,Longitude,$spatial]
NEAR [$temp.Latitude, $temp.Longitude,{"maxDistance":2}]
ORDER BY Distance
有什么建议吗?
我想出了办法...如果假设字段 GeoGlyph.Name
是唯一的是安全的,我可以在 NEAR 子句中使用 first()
:
SELECT *,$distance AS Distance
FROM GeoGlyph
LET $temp = (SELECT * FROM GeoGlyph WHERE Name = "Hands")
WHERE [Latitude,Longitude,$spatial]
NEAR [first($temp).Latitude, first($temp).Longitude,{"maxDistance":2}]
ORDER BY Distance
这似乎可以解决问题。
orientdb {db=nazca.orientdb}> SELECT *,$distance AS Distance FROM GeoGlyph LET $temp = (SELECT * FROM GeoGlyph WHERE Name = "Hands") WHERE [Latitude,Longitude,$spatial] NEAR [first($temp).Latitude, first($temp).Longitude,{"maxDistance":2}] ORDER BY Distance
+----+-----+--------+----------+----------+------+-------------------+
|# |@RID |@CLASS |Latitude |Longitude |Name |Distance |
+----+-----+--------+----------+----------+------+-------------------+
|0 |#25:5|GeoGlyph|-14.694459|-75.113884|Hands |0.0 |
|1 |#25:6|GeoGlyph|-14.693897|-75.11446 |Tree |0.08836394983673491|
|2 |#25:3|GeoGlyph|-14.694363|-75.12358 |Spider|1.0442092937404572 |
|3 |#25:4|GeoGlyph|-14.688309|-75.12276 |Spiral|1.1754175925032648 |
|4 |#25:2|GeoGlyph|-14.698346|-75.128334|Condor|1.614998440581846 |
+----+-----+--------+----------+----------+------+-------------------+
我仍然不确定如果我不能依赖 Name
字段的唯一性,我将如何做到这一点。例如,如果我想计算彼此相距 2 公里以内的所有地理符号对...
我正在尝试组合查询以查找图表中节点 2 公里以内的节点。假设我有一个数据集,它标记了来自纳斯卡线的一些地理符号:
Name,Latitude,Longitude
Hummingbird,-14.692131,-75.148892
Monkey,-14.706940,-75.138532
Condor,-14.697444,-75.126208
Spider,-14.694145,-75.122381
Spiral,-14.688277,-75.122746
Hands,-14.694459,-75.113881
Tree,-14.693898,-75.114520
Astronaut,-14.745222,-75.079755
Dog,-14.706401,-75.130788
Wing,-14.680309,-75.100385
Parrot,-14.689463,-75.107498
我使用以下方法创建了一个空间索引:
CREATE INDEX GeoGlyph.index.Location
ON GeoGlyph(Latitude,Longitude) SPATIAL ENGINE LUCENE
现在,我想找到 "Hands" 字形 2km 以内的节点,我可以通过手动输入 Lat/Long 坐标来输入此查询:
SELECT Name, Latitude, Longitude, $distance AS Distance
FROM GeoGlyph
WHERE [Latitude,Longitude,$spatial]
NEAR [-14.694459,-75.113884,{"maxDistance":2}]
ORDER BY Distance
我得到结果:
+----+------+----------+----------+--------------------+
|# |Name |Latitude |Longitude |Distance |
+----+------+----------+----------+--------------------+
|0 |Hands |-14.694459|-75.113884|5.230883384236603E-6|
|1 |Tree |-14.693897|-75.11446 |0.08836486627516459 |
|2 |Spider|-14.694363|-75.12358 |1.0442063409276094 |
|3 |Spiral|-14.688309|-75.12276 |1.1754176535538237 |
|4 |Condor|-14.698346|-75.128334|1.6149944044266815 |
+----+------+----------+----------+--------------------+
到目前为止,还不错。
由于输入坐标有点麻烦,我更愿意使用名称字段 "Hands" 查找 2 公里以内的字形。
这是我目前卡住的地方。我想我应该能够使用 LET block 来获得我想要的东西......但是我到目前为止所尝试的是行不通的:
SELECT *,$distance AS Distance
FROM GeoGlyph
LET $temp = (SELECT * FROM GeoGlyph WHERE Name = "Hands")
WHERE [Latitude,Longitude,$spatial]
NEAR [$temp.Latitude, $temp.Longitude,{"maxDistance":2}]
ORDER BY Distance
有什么建议吗?
我想出了办法...如果假设字段 GeoGlyph.Name
是唯一的是安全的,我可以在 NEAR 子句中使用 first()
:
SELECT *,$distance AS Distance
FROM GeoGlyph
LET $temp = (SELECT * FROM GeoGlyph WHERE Name = "Hands")
WHERE [Latitude,Longitude,$spatial]
NEAR [first($temp).Latitude, first($temp).Longitude,{"maxDistance":2}]
ORDER BY Distance
这似乎可以解决问题。
orientdb {db=nazca.orientdb}> SELECT *,$distance AS Distance FROM GeoGlyph LET $temp = (SELECT * FROM GeoGlyph WHERE Name = "Hands") WHERE [Latitude,Longitude,$spatial] NEAR [first($temp).Latitude, first($temp).Longitude,{"maxDistance":2}] ORDER BY Distance
+----+-----+--------+----------+----------+------+-------------------+
|# |@RID |@CLASS |Latitude |Longitude |Name |Distance |
+----+-----+--------+----------+----------+------+-------------------+
|0 |#25:5|GeoGlyph|-14.694459|-75.113884|Hands |0.0 |
|1 |#25:6|GeoGlyph|-14.693897|-75.11446 |Tree |0.08836394983673491|
|2 |#25:3|GeoGlyph|-14.694363|-75.12358 |Spider|1.0442092937404572 |
|3 |#25:4|GeoGlyph|-14.688309|-75.12276 |Spiral|1.1754175925032648 |
|4 |#25:2|GeoGlyph|-14.698346|-75.128334|Condor|1.614998440581846 |
+----+-----+--------+----------+----------+------+-------------------+
我仍然不确定如果我不能依赖 Name
字段的唯一性,我将如何做到这一点。例如,如果我想计算彼此相距 2 公里以内的所有地理符号对...