为什么java.lang.StackOverflowError错误进入groovy

时间:2011-11-21 06:57:18

标签: groovy neo4j graph-databases

运行以下代码时

def v1=[];
def p=[];
 v.as('x')
    .except(v1).sideEffect{v1.add(it)}  // step 1
    .outE('priority').inV               // step 2
    .except(p).sideEffect{p.add(it)}    // step 3
    .inE('priority').outV               // step 4
    .loop('x'){true} >> -1;             // step 5
return [vertices:v1, priorities:p];

收到此错误:

"exception": "java.lang.StackOverflowError",
    "stacktrace": [
        "java.lang.reflect.InvocationTargetException.(InvocationTargetException.java:72)",
        "sun.reflect.GeneratedMethodAccessor259.invoke(Unknown Source)",
        "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)",
        "java.lang.reflect.Method.invoke(Method.java:616)",
        "org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)",
        "groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)",
        "org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)",
        "groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:883)",
        "groovy.lang.Closure.call(Closure.java:410)",
        "org.codehaus.groovy.runtime.DefaultGroovyMethods.callClosureForMapEntry(DefaultGroovyMethods.java:3392)",
        "org.codehaus.groovy.runtime.DefaultGroovyMethods.collect(DefaultGroovyMethods.java:2188)",
        "org.codehaus.groovy.runtime.DefaultGroovyMethods.collect(DefaultGroovyMethods.java:2205)",
        "org.codehaus.groovy.runtime.dgm$77.invoke(Unknown Source)",

堆栈跟踪更多。

请说明为什么会出现此错误。

1 个答案:

答案 0 :(得分:0)

我没有看到任何明显的问题,为什么这个查询会给你一个堆栈溢出。但是,看看你的堆栈跟踪,我相信(虽然不确定),你的问题与你的return语句有关。您可能希望将查询分解为较小的块以查看问题发生的位置。

旁注:这里有一个提示,使您的查询更简洁:

.outE('priority').inV  --write as--> out('priority')

如果您在边缘上唯一推理的是标签,那么您可以简单地在顶点之间跳转而不是触摸边缘。

最后,请注意Gremlin 1.4将使用loop()步骤提供“emit”功能。这样,你不需要在循环中将sideEffect {}保存元素放入列表中,你可以简单地发出它们。因此,更容易说,“当我循环这个分支时,返回我触摸的所有东西。”

没有直接解决方案的道歉......

马尔科。

http://markorodriguez.com