2017-09-22 3 views
2

頂点を置き換えたりマージしたり、既存の辺を維持/マージする簡単な方法はありますか?または、手動で頂点からすべてのプロパティを手動でコピーし、既存のエッジとすべての(メタ)プロパティを再作成して、余分な頂点を削除しますか?Tinkerpop/gremlin頂点(および辺)をマージする

+0

あなたのユースケースに少し手の込んだことはできますか?あなたは輸入について話していますか?もしそうなら、どのように頂点をインポートしますか?どのグラフデータベースを使用していますか? –

+0

私のユースケースは、さまざまなソースからのデータを含む知識グラフです。このデータは、同じエンティティの異なる側面を記述することができます。異なるソースは、必ずしもこれらのエンティティの共通識別子を持っているとは限りません。十分なデータがある場合、私はどの頂点が同じエンティティであるかを特定することができるので、それらの頂点(それらの頂点を含む)をマージしたいと思います。私が使用しているデータベースは問題ではありませんが、私はJanusGraph(CassandraとElasticsearchを使用しています)を使用しています。 – user3508638

+0

dbは重要ですが、私は別の方法で尋ねたことはありません。各データベースには独自の機能が追加されています。ですから、Janusにとっては、カスタム頂点プログラムを書くことは良い考えです。どのように頂点にマッチしますか?長時間実行されているOLAPジョブなどをOLTPに短期間使用していますか? –

答えて

3

上記のコメントに記載されているとおり、OLTPでのマッチングを行います。つまり、具体的なエントリポイントがある可能性があります。のは、簡単なサンプルグラフを作ってみましょう:

g = TinkerGraph.open().traversal() 

// Stackoverflow data 
g.addV("user").property("login", "user3508638").as("a"). 
    addV("user").property("login", "dkuppitz").property("age", 35).as("b"). 
    addV("question").property("title", "Tinkerpop/gremlin merge vertices (and edges)").as("c"). 
    addE("posted").from("a").to("c"). 
    addE("commented").from("b").to("c").property("time", 123).iterate() 

// Github data 
g.addV("user").property("login", "dkuppitz").property("name", "Daniel Kuppitz").as("a"). 
    addV("project").property("title", "TinkerPop").as("b"). 
    addE("contributed").from("a").to("b").iterate() 

ログインdkuppitzに基づいて頂点を一致させ、単一のユーザーの頂点にマージするには:

g.V().has("login", "dkuppitz"). 
    fold().filter(count(local).is(gt(1))).unfold(). 
    sideEffect(properties().group("p").by(key).by(value())). 
    sideEffect(outE().group("o").by(label).by(project("p","iv").by(valueMap()).by(inV()).fold())). 
    sideEffect(inE().group("i").by(label).by(project("p","ov").by(valueMap()).by(outV()).fold())). 
    sideEffect(drop()). 
    cap("p","o","i").as("poi"). 
    addV("user").as("u"). 
    sideEffect(
    select("poi").select("p").unfold().as("kv"). 
    select("u").property(select("kv").select(keys), select("kv").select(values))). 
    sideEffect(
    select("poi").select("o").unfold().as("x"). 
    select("u").sideEffect { u -> 
     u.path("x").getValue().each { x -> 
     def e = u.get().addEdge(u.path("x").getKey(), x.get("iv")) 
     x.get("p").each { p -> 
      e.property(p.getKey(), p.getValue()) 
     } 
     } 
    }). 
    sideEffect(
    select("poi").select("i").unfold().as("x"). 
    select("u").sideEffect { u -> 
     u.path("x").getValue().each { x -> 
     def e = x.get("ov").addEdge(u.path("x").getKey(), u.get()) 
     x.get("p").each { p -> 
      e.property(p.getKey(), p.getValue()) 
     } 
     } 
    }).iterate() 

私が知っている、クエリは特にして、複雑な狂気であります深くネストされたラムダ。しかし、私たちはaddE(<traversal>)オーバーロード(私はticketを作成しました)がないので、残念ながらラムダの周りには方法がありません。いずれにせよ、上記のクエリを実行した後、グラフは次のようになり:1(nameage特性が存在している)に

gremlin> g.V().valueMap() 
==>[login:[user3508638]] 
==>[title:[Tinkerpop/gremlin merge vertices (and edges)]] 
==>[title:[TinkerPop]] 
==>[name:[Daniel Kuppitz],login:[dkuppitz],age:[35]] 
gremlin> g.V().has("login", "dkuppitz").bothE() 
==>e[19][15-commented->5] 
==>e[20][15-contributed->12] 
gremlin> g.V().has("login", "dkuppitz").bothE().valueMap(true) 
==>[label:commented,time:123,id:19] 
==>[label:contributed,id:20] 

両方dkuppitz頂点をマージし、2つの縁部は、それに応じて再作成しました。

UPDATE:TINKERPOP-1793

は、我々はすべてのラムダを取り除くことができます。

g.V().has("login", "dkuppitz"). 
    fold().filter(count(local).is(gt(1))).unfold(). 
    sideEffect(properties().group("p").by(key).by(value())). 
    sideEffect(outE().group("o").by(label).by(project("p","iv").by(valueMap()).by(inV()).fold())). 
    sideEffect(inE().group("i").by(label).by(project("p","ov").by(valueMap()).by(outV()).fold())). 
    sideEffect(drop()). 
    cap("p","o","i").as("poi"). 
    addV("user").as("u"). 
    sideEffect(
    select("poi").select("p").unfold().as("kv"). 
    select("u").property(select("kv").select(keys), select("kv").select(values))). 
    sideEffect(
    select("poi").select("o").unfold().as("x").select(values). 
    unfold().addE(select("x").select(keys)).from(select("u")).to(select("iv"))). 
    sideEffect(
    select("poi").select("i").unfold().as("x").select(values). 
    unfold().addE(select("x").select(keys)).from(select("ov")).to(select("u"))).iterate() 
関連する問題