2017-02-10 1 views
3

背景:gremlin(tinkerpop v3)を使用して、this approachを使用して時系列のバージョンDBを実装しようとしています。Gremlin - プロパティを明示的にリストすることなく、プロパティを結合するためにどのように頂点をマージしますか?

enter image description here

は、私は(青)、(タイムスタンプの範囲が含まれている「状態」エッジによってリンク)指定されたアイデンティティのノードのために(赤)、最新の状態ノードを取得したいが、私は返すようにしたいですアイデンティティノードからのid(cid)と状態ノードからのすべてのプロパティを含む単一の集約オブジェクトですが、明示的にリストする必要はありません。 (8640000000000000は、 'to'の日付を示す私の方法です - つまり、エッジは現在のものです - 画像と少し異なります)。

私がここまで持っている:

:> g.V().hasLabel('product'). 
    as('cid'). 
    outE('state'). 
    has('to', 8640000000000000). 
    inV(). 
    as('name'). 
    as('price'). 
    select('cid', 'name','price'). 
    by('cid'). 
    by('name'). 
    by('price') 

=>{cid=1, name="Cheese", price=2.50} 
=>{cid=2, name="Ham", price=5.00} 

いますが、私は「状態」ノードのプロパティを一覧表示する必要が見ることができるように - 製品の名称および価格の特性上の例では。しかし、これはどんなドメインオブジェクトにも適用されるので、私はいつもプロパティをリストする必要はありません。私はこの前にクエリを実行してプロパティを取得することができましたが、2つのクエリを実行し、2回の往復のオーバーヘッドが必要であるとは思いません。私は '集約'、 'ユニオン'、 '折りたたみ'などを見てきましたが、何もこれを行うようです。

アイデア?

===================

編集: 私は行くよ(かなり私はATMをやりたいしません)ダニエルの答えに基づいて、彼のサンプルグラフを使用します。 'modernGraph' people-create->ソフトウェア。実行した場合:

> g.V().hasLabel('person').valueMap() 
==>[name:[marko], age:[29]] 
==>[name:[vadas], age:[27]] 
==>[name:[josh], age:[32]] 
==>[name:[peter], age:[35]] 

結果は、プロパティを持つエンティティのリストになります。私が望むのは、人がソフトウェアの1つだけを作成することができるという前提です(作成されたソフトウェアのリストのためにこれがどのように開かれるのかが分かります)。これまでの最高の提案は、以下を思い付く現時点で

> <run some query here> 
==>[name:[marko], age:[29], lang:[java]] 
==>[name:[vadas], age:[27], lang:[java]] 
==>[name:[josh], age:[32], lang:[java]] 
==>[name:[peter], age:[35], lang:[java]] 

:取得するエンティティを返さ

> g.V().hasLabel('person').union(identity(), out("created")).valueMap().unfold().group().by {it.getKey()}.by {it.getValue()} 
==>[name:[marko, lop, lop, lop, vadas, josh, ripple, peter], lang:[java, java, java, java], age:[29, 27, 32, 35]] 

私はそれがより明確に願っています。そうでない場合は、私に知らせてください。

答えて

6

私はサンプルグラフを提供していないので、私はTinkerPopのおもちゃグラフを使ってそれがどのように行われたかを表示します。

あなたは markolopマージするとします:2つの name性質があることを、

gremlin> g = TinkerFactory.createModern().traversal() 
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard] 
gremlin> g.V(1).valueMap() 
==>[name:[marko],age:[29]] 
gremlin> g.V(1).out("created").valueMap() 
==>[name:[lop],lang:[java]] 

注意をし、理論的には、あなたはnameがあなたのマージ結果にそれを作るかを予測することはできません。しかし、それはあなたのグラフでは問題ではないようです。

両方の頂点のプロパティを取得します。

gremlin> g.V(1).union(identity(), out("created")).valueMap() 
==>[name:[marko],age:[29]] 
==>[name:[lop],lang:[java]] 

はそれらをマージ:

gremlin> g.V(1).union(identity(), out("created")).valueMap(). 
      unfold().group().by(select(keys)).by(select(values)) 
==>[name:[lop],lang:[java],age:[29]] 

UPDATE

は、追加サンプル出力をいただき、ありがとうございます。それで解決策が出てくるのがずっと簡単です(あなたの出力にはエラーがありますが、何も作成しませんでした)。

gremlin> g.V().hasLabel("person"). 
      filter(outE("created")).map(
      union(valueMap(), 
        outE("created").limit(1).inV().valueMap("lang")). 
      unfold().group().by {it.getKey()}.by {it.getValue()}) 
==>[name:[marko], lang:[java], age:[29]] 
==>[name:[josh], lang:[java], age:[32]] 
==>[name:[peter], lang:[java], age:[35]] 
+0

ありがとうございます!私はidentity()コールが私がドキュメントで見逃していたものだと思います。残念なことに、私はグラフと 'モダン'グラフの両方でこれを試してみました。両方で 'No such property:class for groovysh_evaluate'を取得しました。何か案は?最後の1つまでのすべてのクエリは、上記の答えに従って動作します。 –

+0

どのTinkerPopのバージョンをお使いですか?テスト用に使用したものより古いかもしれません。 IIRCの古いバージョンは '.mapKeys()'と '.mapValues()'を持っていましたが、それらを代わりに使用しようとしました。 –

+0

ahはい... [titanDb](https://github.com/awslabs/dynamodb-titan-storage-backend)を使用しているので、Tinkerpop 3.0.1はインキュベートしています。あなたはmapKeys()などについては正しかったが、gremlin> gV(1).union(identity()、out( "created"))。valueMap()。unfold()。group() (select(mapValues())) メソッドのシグネチャがありません:static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph .__。select()が適用されます。 (Map.AccessKey());}}また、引数の型の場合:(org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal)values:[[MapKeysStep]] –

関連する問題