I have a simple dataset that I'm playing with to test out the geospatial 
capabilities of the orientdb-spatial module.

The input is just a simple table of a few of the nazca line geoglyphs.

Name,Latitude,Longitude
Hummingbird,-14.692131,-75.148892
Monkey,-14.7067274,-75.1475391
Condor,-14.6983457,-75.1283374
Spider,-14.694363,-75.1235815
Spiral,-14.688309,-75.122757
Hands,-14.694459,-75.113881
Tree,-14.693897,-75.114467
Astronaut,-14.745222,-75.079755
Dog,-14.706401,-75.130788

Ultimately, I'd like to put together a query that can generate edges in the 
graph from nodes to the neighbors that are within N km.  For a threshold of 
2km, I'd end up with edges that are something like this:

<https://lh3.googleusercontent.com/-RtKkxS4pPQ4/WEbxjaDrGxI/AAAAAAAAHfE/M9ouR5YHkxA3GoHtgXIpfCgCJMg3hLB9QCLcB/s1600/Nazca_Lines_Proximity.png>

but it doesn't appear that I could do this with some kind of CREATE EDGES 
query directly, so I'm left with native Java or a Javascript server-side 
function.  I'm working on a function to do this, so the first part is to 
generate a table containing the SourceNode, DestNode, and Distance which I 
can then use to create the edges.

Thus far, I've only been able to get a query like this to work, which can 
only find my features that are within some distance of a specific node.

SELECT $temp.@rid as SourceRID, 
       $temp.Name AS SourceName, 
       @rid AS DestRID, 
       Name AS DestName, 
       $distance.format("%.4f") AS Distance 
FROM GeoGlyph 
LET $temp = first((SELECT * FROM GeoGlyph WHERE Name = "<GEOGLYPH NAME>")) 
WHERE [Latitude,Longitude,$spatial] NEAR [$temp.Latitude, $temp.Longitude,{
"maxDistance":2}] 
  AND Name != "<GEOGLYPH NAME>" 
ORDER BY Distance

I can run this inside a loop over all the nodes in my graph to build a list 
of all the pairs, which can then be used to generate my edges.  The 
javascript function that I'm mucking around with to explore this looks like 
the following:

var g = orient.getGraph();

// set max distance threshold
var distance = 2;

// get the list of all GeoGlyph vertices
var v = g.command('sql', 'SELECT FROM GeoGlyph');

var edges = [];
var seen  = {};

for(i=0; i<v.length; i++)
{
  var name  = v[i].getRecord().field('Name');
  var srcid = v[i].getRecord().field('@rid');
  seen[name] = true;
    
  query = 'SELECT $temp.Name AS SourceName, @rid AS DestRID, Name AS 
DestName, $distance.format("%.4f") AS Distance FROM GeoGlyph LET $temp = 
first((SELECT * FROM GeoGlyph WHERE Name = "'+name+'")) WHERE 
[Latitude,Longitude,$spatial] NEAR [$temp.Latitude, 
$temp.Longitude,{"maxDistance":'+distance+'}] AND Name != "'+name+'" ORDER 
BY Distance';

  // Get a list of geoglyphs that are within 2km of the current geoglyph.  
  var p = g.command('sql', query);
  
  for(j=0; j<p.length; j++)
  {      
    var destName = p[j].getRecord().field('DestName');    
    if(destName in seen)
    {
      continue;
    }
    var dstid = p[j].getRecord().field('DestRID');
    var dist  = p[j].getRecord().field('Distance');    
    var row   = [srcid, dstid, name, destName, dist];            
    edges.push(row);
  }   
}

// Loop over the data and print out the @rid field for source and dest..
for(i=0; i<edges.length; i++)
{
  print(edges[i][0] +"     "+ edges[i][1]); 
}

The output I get from the print statement in the final loop is this:

#25:0     
GeoGlyph#25:1{Latitude:-14.706727,Longitude:-75.14754,Name:Monkey} v1
#25:1     GeoGlyph#25:8{Latitude:-14.706401,Longitude:-75.13079,Name:Dog} v1
#25:2     
GeoGlyph#25:3{Latitude:-14.694363,Longitude:-75.12358,Name:Spider} v1
...

So, I can get the source RID just fine, but the dest RID isn't just a 
"#nn:nn" style format... it's the document.  

How can I modify the SELECT statement in my query to get the RID as just a 
string?

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"OrientDB" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to