比较TRAVERSE中的顺序边缘属性

时间:2016-12-18 05:17:43

标签: orientdb gremlin

我想使用TRAVERSE找到两个顶点之间的路径。但我只需要具有特定属性的边缘,该边缘大于前一边缘的相应属性。例如,我想按时间顺序使用边缘。

在gremlin中,我可以这样做:

select gremlin("current.as('x').outE('SentTo').as('c').inV.outE('SentTo').
filter{e, m -> m.get('c').getProperty('time') <= e.getProperty('time')}.
inV.loop('x'){it.object.getProperty('name') != 'John' && it.loops < 10}.
path.filter{it.last().getProperty('name') =='John'}")
FROM (SELECT FROM Person WHERE name = 'Bill')

但是,几乎所有在orientdb中的gremlin查询都会持续存在,并且给定的查询会因GC开销错误而崩溃。

要进行比较,下面的查询大约需要5秒钟(我的数据库有大约1M顶点和2M边缘):

SELECT
  $path
FROM
  (TRAVERSE 
     out('SentTo')
   FROM
     (SELECT FROM Person WHERE name = 'John')
   WHILE
     $depth < 10)
WHERE (SELECT FROM Person WHERE name = 'Bill')

所以,我想知道如何修改TRAVERSE查询以比较边缘之间的时间或(几乎)如何优化gremlin查询

由于

1 个答案:

答案 0 :(得分:2)

我想我已经听说OrientDB最终支持TinkerPop3。如果是这种情况,那么请考虑使用以下遍历:

g.V().has("Person", "name", "Bill").
  repeat(outE().or(__.not(select("e")),
                   __.where(gte("e")).by("time")).as("e").otherV()).
   until(has("name", "John").or().loops().is(gte(10))).has("name", "John").path().limit(1)