【问题标题】:rooted spatial query with sub-select in OrientDB在 OrientDB 中使用子选择进行根空间查询
【发布时间】:2016-12-02 23:30:10
【问题描述】:

我正在尝试组合一个查询来查找图中节点 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

现在,我想找到“手”字形 2 公里范围内的节点,我可以通过手动输入纬度/经度坐标来输入此查询:

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  |
+----+------+----------+----------+--------------------+

到目前为止,一切都很好。

由于输入坐标有点麻烦,我宁愿只使用名称字段“手”来查找 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

有什么建议吗?

【问题讨论】:

    标签: orientdb orientdb2.2


    【解决方案1】:

    我想出了办法...如果可以安全地假设字段 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 公里内的所有地理符号对......

    【讨论】:

    • 你能解释一下 first() 函数的使用吗?我一直在努力解决与您的问题非常相似的问题,看来您的方法可以解决它。 http://stackoverflow.com/q/43861961/5013735是时候试试了!
    • @jobel 嗨,我的理解是 LET $temp = (SELECT ...) 的技巧实际上是 $temp 存储结果列表。我的示例关闭了知道 $temp 将只有一个条目,因为 Name 字段是唯一的,我可以使用 first() 将第一个条目从该列表中拉出并引用它的元素。
    猜你喜欢
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多