2016-12-02 6 views
0

私は、グラフのノードから2km以内にあるノードを見つけるためにクエリをまとめようとしています。 「手の2キロ以内に今OrientDBのサブセレクト付きのルート付き空間クエリ

CREATE INDEX GeoGlyph.index.Location 
ON GeoGlyph(Latitude,Longitude) SPATIAL ENGINE LUCENE 

は、私が欲しいのノードを見つけるために:私は、空間インデックスを使用して作成してい

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 

:私はナスカの地上絵からいくつかの地上絵をマークしたデータセットを持っていると言います「グリフ、私は手動で緯度/経度の座標に置くことによって、このクエリで入力できます。

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

これまでのところ、とても良いです。

座標を入力するのはちょっと難しいので、2km以内のグリフを探して、名前フィールド「手」を使ってください。

これは私が現在立ち往生している場所です。私は私が欲しいものを得るために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 

任意の提案ですか?

答えて

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フィールドの一意性に依存していることができなかった場合、私はこれを行うだろう正確かどうかはわかりません。例えば、互いに2km以内のすべての地形図を計算したいと思ったら...

+0

first()関数の使い方についてもう少し説明できますか?私はあなたの質問によく似た何かに苦労していました。あなたのアプローチが解決するかもしれません。 [http://stackoverflow.com/q/43861961/5013735] (http://stackoverflow.com/q/43861961/5013735)それを試す時間! – Jobel

+0

@jobelこんにちは、ここで私の理解は、LET $ temp =(SELECT ...)のトリックは実際に$ tempが結果のリストを格納していることです。私の例では、名前フィールドが一意であるので、$ tempはその中に1つのエントリしか持たないことを知っているので、first()を使ってそのリストから最初のエントリを取り出し、その要素を参照することができます。 – TxAG98

関連する問題