【问题标题】:Compare sequential edge properties in TRAVERSE比较 TRAVERSE 中的顺序边属性
【发布时间】:2017-05-03 12:11:18
【问题描述】:

我想使用 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 查询

谢谢

【问题讨论】:

    标签: orientdb gremlin


    【解决方案1】:

    我想我听说 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多