我想使用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查询
由于
答案 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)