頂点を置き換えたりマージしたり、既存の辺を維持/マージする簡単な方法はありますか?または、手動で頂点からすべてのプロパティを手動でコピーし、既存のエッジとすべての(メタ)プロパティを再作成して、余分な頂点を削除しますか?Tinkerpop/gremlin頂点(および辺)をマージする
2
A
答えて
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(name
とage
特性が存在している)に
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()
関連する問題
- 1. 頂点、通常、およびtexcoordinateインデックス
- 2. 頂点と辺のテキストファイルからグラフを作成する
- 3. mxGraphの頂点間の辺の数を制限する
- 4. 頂点の頂点を頂点で4.2で検証する
- 5. 頂点から全ての出て行く辺の頂点を得る方法scala gremlin
- 6. TFS 2010ブランチングおよびマージ
- 7. Hibernateのマッピングおよびマージ
- 8. センター、ノーマル、レングス、および高さで長方形の頂点を取得
- 9. ThreeJSで頂点ごとおよび頂点ごとに発光を発光させるにはどうすればよいですか?
- 10. 頂点シェーダ対頂点
- 11. 頂点バッファデータを配列頂点データフロー
- 12. matlab:平行四辺形の4番目の頂点を見つける
- 13. 頂点からの頂点バッファ
- 14. テクスチャデータを頂点シェーダの頂点データとして解釈する
- 15. 頂点テクスチャフェッチ(頂点シェーダでテクスチャを読み取る)
- 16. IE標準、相違点および相違点の相違点
- 17. 動的バインドされた頂点の行をマージする:visualforceページのpageblockTableページ
- 18. XNA - 頂点ストリーム?
- 19. 非ハッシュタイプ:「頂点」
- 20. javascript頂点undoManager
- 21. カスタム頂点カラー()
- 22. 加重頂点カバーRにおけるROIパッケージ
- 23. Z-Up頂点をY-Up頂点に変換する方法。 (DX9c)
- 24. サークルグラフの頂点の外に頂点ラベルを自由に配置するR
- 25. bfs javaの2つの頂点の間のすべての辺を取得する方法
- 26. ブレンダー、リギング、頂点グループ
- 27. 頂点シェーダのテクスチャルックアップ
- 28. 最小頂点カバー
- 29. DirectX 11頂点シェーダリフレクション
- 30. 6カラーグラフ頂点カラーアルゴリズム
あなたのユースケースに少し手の込んだことはできますか?あなたは輸入について話していますか?もしそうなら、どのように頂点をインポートしますか?どのグラフデータベースを使用していますか? –
私のユースケースは、さまざまなソースからのデータを含む知識グラフです。このデータは、同じエンティティの異なる側面を記述することができます。異なるソースは、必ずしもこれらのエンティティの共通識別子を持っているとは限りません。十分なデータがある場合、私はどの頂点が同じエンティティであるかを特定することができるので、それらの頂点(それらの頂点を含む)をマージしたいと思います。私が使用しているデータベースは問題ではありませんが、私はJanusGraph(CassandraとElasticsearchを使用しています)を使用しています。 – user3508638
dbは重要ですが、私は別の方法で尋ねたことはありません。各データベースには独自の機能が追加されています。ですから、Janusにとっては、カスタム頂点プログラムを書くことは良い考えです。どのように頂点にマッチしますか?長時間実行されているOLAPジョブなどをOLTPに短期間使用していますか? –