почему ошибка java.lang.StackOverflowError идет в groovy - PullRequest
0 голосов
/ 21 ноября 2011

при выполнении следующего кода:

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];

m получает эту ошибку:

"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 голосов
/ 21 ноября 2011

Я не вижу ничего очевидного в том, почему этот запрос дает вам переполнение стека. Однако, глядя на вашу трассировку стека, я полагаю (хотя и не уверен), что ваша проблема связана с вашим оператором return. Возможно, вы захотите разбить ваш запрос на более мелкие куски, чтобы увидеть, где возникает проблема.

Sidenote: вот подсказка, чтобы сделать ваш запрос более кратким:

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

Если единственное, что вы рассуждаете на ребре, это метка, то вы можете просто перепрыгивать между вершинами, а не касаться ребер.

Наконец, обратите внимание, что Gremlin 1.4 обеспечит функциональность "emit" с помощью шага loop (). Таким образом, вам не нужно sideEffect {} сохранять элементы во время цикла в списке, вы можете просто их лениво генерировать. Таким образом, будет легче сказать: «верните все, к чему я прикасаюсь, когда я зацикливаюсь на этой ветви».

Извинения за отсутствие прямого решения ....

Marko.

http://markorodriguez.com

...