2

各エッジの 1 つのプロパティを比較して、頂点名 (オーバーラップ) をフィルター処理したいと考えていました。

次のような単純なデータセットがあるとします。

A  --> 100  --> B
A  --> 200  --> C
A  --> 100  --> D

上記のように、エッジ プロパティ (100、200 など) に基づいて共通の頂点を表示したい場合を参照してください。

A 100 B
A 100 D

これは私が試したGremlinコードです:

g.V.outE('give').filter{it.amt.next() == it.amt.next()}

また、 has 句を使用して出力できませんか? 結果は返されません。私は何を逃したのですか?

4

2 に答える 2

1

1 つの方法は、groupBy 操作を使用することです (groupCount を使用するようにコメントで @abhi によって同様の推奨が行われました)。

gremlin> g = new TinkerGraph()
==>tinkergraph[vertices:0 edges:0]
gremlin> a = g.addVertex("A") 
==>v[A]
gremlin> b = g.addVertex("B") 
==>v[B]
gremlin> c = g.addVertex("C")              
==>v[C]
gremlin> d = g.addVertex("D")                
==>v[D]
gremlin> g.addEdge(a, b, 'give', [amt:100])
==>e[0][A-give->B]
gremlin> g.addEdge(a, c, 'give', [amt:200])
==>e[1][A-give->C]
gremlin> g.addEdge(a, d, 'give', [amt:100])
==>e[2][A-give->D]
gremlin> g.V.outE('give').groupBy{it.amt}{[it.outV.next(), it.inV.next()]}.cap.next()
==>100=[[v[A], v[D]], [v[A], v[B]]]
==>200=[[v[A], v[C]]]

結果を複数の一致があるものだけに制限するには、groovy (この場合は findAll) を使用してマップを後処理するだけです。

gremlin> m=[:];g.V.outE('give').groupBy(m){it.amt}{[it.outV.next(), it.inV.next()]}        
==>e[2][A-give->D]
==>e[1][A-give->C]
==>e[0][A-give->B]
gremlin> m
==>100=[[v[A], v[D]], [v[A], v[B]]]
==>200=[[v[A], v[C]]]
gremlin> m.findAll{it.value.size()>1}
==>100=[[v[A], v[D]], [v[A], v[B]]]
于 2013-09-18T16:20:50.637 に答える
0

問題を一般化するよりも、実際の例を使用して特定の質問をする方が常に優れています。私の理解に基づいて、以下はCypher表記です。Cypher で、Gremlin に変換できると思われる例を挙げています。不要な場合はコメントいただければ、この回答を削除します。

設定

CREATE (A { name: 'A' })-[:GAVE { amount: 100 }]->(B { name: 'B' }) 
CREATE A-[:GAVE { amount: 200 }]->(C { name: 'C' }) 
CREATE A-[:GAVE { amount: 100 }]->(D { name: 'D' })

クエリ

量が 100 であるすべてのノード (頂点) を返します。

MATCH n1-[gave:GAVE]->n2 
WHERE gave.amount=100 
RETURN n1.name, gave.amount, n2.name

こちらのコンソールでこれを試すことができます。

質問を実際の例で更新し、neo4j.console.org でテスト データをより適切にセットアップしてから、コンソールの上部にある [共有] ボタンをクリックして共有します。

于 2013-09-18T15:47:01.207 に答える