我的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毫秒。
答案 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),因为它只构造一个对象,而后者需要更长的时间,因为它必须与您的底层图形存储进行交互。