0

次のコードを実行している間:

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)",

より多くのスタックトレースがあります。

このエラーが発生する理由を提案してください。

4

1 に答える 1

0

このクエリがスタックオーバーフローを引き起こしている理由については、明らかなことは何もわかりません。ただし、スタックトレースを見ると、(確かではありませんが)問題はreturnステートメントにあると思います。クエリを小さなチャンクに分解して、問題が発生している場所を確認することをお勧めします。

補足:クエリをより簡潔にするためのヒントは次のとおりです。

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

エッジで推論しているのがラベルだけである場合は、エッジに触れることなく、頂点間をジャンプするだけで済みます。

最後に、Gremlin 1.4は、loop()ステップで「emit」機能を提供することに注意してください。このように、ループ中に要素をリストに保存するためにsideEffect {}する必要はなく、単にそれらを怠惰に放出することができます。したがって、「このブランチをループダウンするときに、触れたすべてのものを返す」と言うのは簡単です。

直接的な解決策がないことをお詫びします。

マルコ。

http://markorodriguez.com

于 2011-11-21T16:03:55.543 に答える