从遍历

时间:2018-03-07 17:15:51

标签: java graph-theory gremlin tinkerpop tinkerpop3

我的Java应用程序中有一个图形遍历,在遍历完成后需要花费300毫秒来填充路径对象。它很奇怪,因为它只发生在某些特定的遍历上,而其他遍历则立即填充其路径。以下是使用Tinkerpop 3.3.1

的Java代码示例

我有一种情况,两个顶点直接连接在一条边上。每次执行这个简短的遍历时,我都会得到很高的处理时间。如果我不执行fill()操作,则遍历立即完成。我有其他遍历需要经过10个以上的边缘,并且它们处理并填充< 1毫秒。

在下面的代码中,我试图找到来自顶点的最短路径' origs'在'dests'中的顶点没有通过集合中的任何顶点'避免'。遍历本身在1ms内完成,它的fill()方法正在扼杀时钟。

    Date startTime = new Date ();
    if (! dests.isEmpty ()){
        g.V (origs).where (is (P.without (avoids))).    
        repeat (
                out ().
                simplePath ().
                where (is (P.without (avoids)))
                ).
                until (is (P.within (dests))).
                limit (1).
                path ().
                fill (paths);  // This 'fill' is the line that can take > 300ms.
                               // When fill is removed from the code,
                               // this all executes within the same milli
    }
    Date endTime = new Date ();
    // Now compare start time and end time
    int diff = DateUtil.getMillisBetween  (startTime, endTime);

我也尝试过使用toList()方法,但这也使得代码执行时间超过300毫秒。

1 个答案:

答案 0 :(得分:4)

您的遍历是在没有fill()toList()的情况下即时进行的,因为如果没有“迭代”您没有得到结果,您只有GraphTraversal个实例:

http://tinkerpop.apache.org/docs/current/tutorials/the-gremlin-console/#result-iteration

换句话说:

t = g.V()

创建GraphTraversal个实例,但不会将g.V()的结果分配给t。另一方面:

t = g.V().toList()

将遍历迭代为List并将结果分配给t。显然,前者将立即完成(即<1ms),因为它只构造一个对象,而后者需要更长的时间,因为它必须与您的底层图形存储进行交互。