2016-12-18 5 views
0

Я хочу найти путь между двумя вершинами, используя TRAVERSE. Но мне нужны только грани с определенным свойством, которое больше соответствующего свойства предыдущего края. Например, я хочу использовать ребра в порядке времени.Сравните свойства последовательных краев в TRAVERSE

В гном я могу это сделать:

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 длится вечно, и данный запрос вылетает с ошибкой 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') 

Итак, я хочу знать, как изменить траверс запрос для сравнения времени между фронтами или (вряд ли), как оптимизировать Gremlin-запрос

Благодаря

ответ

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)