0

Gremlin を使用して単一のトラバーサルを実行し、DSE Graph 5.0 から一度に多くのものを取得しようとすると、非常に単純なことに非常に不満を感じます..

私の単純化されたケースでは、次のものがあります。

  • 特定の uuid を持つ 1 つのエンティティ
  • エンティティはゼロ (オプションを参照) またはそれ以上のタイプを持つことができます
  • と を返すことができる必要がありentityますtypes

私がこれまでに持っているものは非常に醜いです:(

List list = g.V().hasLabel("Entity").has("uuid","6708ec6d-4518-4159-9005-9e9d642f157e").as("entity")
        .optional(outE("IsOfType").as("types"))
        .select("entity", "types").toList();
List<Edge> typeEdges = new ArrayList<>();
Vertex entityV = null;
for (Object obj : list) {
    entityV = ((Vertex)((LinkedHashMap) obj).get("entity"));
    Edge typeEdge = ((Edge)((LinkedHashMap) obj).get("types"));
    typeEdges.add(typeEdge);
}

リストの各行には、エンティティといずれかのタイプがあります:/

edges()DSE 5.0 Fluent API のトラバーサルに基づいてVertex が設定されていないため、私はこれをすべて行っています。したがって、複数のトラバーサル、またはJavaオブジェクトでデシリアライズするのが非常に難しい単一の巨大なひどいトラバーサルで立ち往生しているか、グレムリンクエリを文字列として渡す必要がありますが、Gremlin VertexオブジェクトではなくDSEを返します:(

単純化されていない私のケースでは、上記の複数のエンティティをそれぞれのタイプで返したいのですが、どうすればこれを行うことができますか?

最後に、異なるタイプのオブジェクトを持つサブグラフのカスタム オブジェクト マッピングのための再利用可能なコードにつながる良いアプローチは何ですか?

助けてくれてありがとう!

4

1 に答える 1

1

が関係である場合Entity:Typeは、1:nも必要ありませんoptional()

g.V().has("Entity","uuid","6708ec6d-4518-4159-9005-9e9d642f157e").
  project("entity","types").by().by(outE("IsOfType").fold())

結果は型になりList<Map<String, Object>>ます。

アップデート

以下のコメントでの短いtoList()議論に続いて、コレクションに全体を保存せずにトラバーサル結果を操作する方法を次に示します。

g.V().has("Entity","uuid","6708ec6d-4518-4159-9005-9e9d642f157e")
        .project("entity","types").by().by(outE("IsOfType").fold())
        .forEachRemaining(m -> {
            final Vertex entityV = (Vertex) m.get("entity");
            final List<Edge> typeE = (List<Edge>) m.get("types");
            // whatever ...
        })
于 2016-12-23T18:41:04.893 に答える