いつものように、のは、サンプルのグラフから始めましょう:あなたは既に見ることができるように
g = TinkerGraph.open().traversal()
g.addV(id, "user 1").as("u1").
addV(id, "user 2").as("u2").
addV(id, "user 3").as("u3").
addV(id, "movie 1").as("m1").
addV(id, "movie 2").as("m2").
addV(id, "movie 3").as("m3").
addE("friend").from("u1").to("u2").
addE("friend").from("u1").to("u3").
addE("like").from("u2").to("m1").
addE("like").from("u2").to("m2").
addE("like").from("u3").to("m2").
addE("like").from("u3").to("m3").iterate()
、唯一movie 2
user 1
のすべての友達からも好かれました。質問に答えるトラバーサルは(コメントをインラインで)、以下:
gremlin> g.V("user 1"). /* start at user 1 */
out("friend").aggregate("friends"). /* collect all his friends */
out("like").dedup(). /* traverse to all the movies they liked */
filter(
__.in("like").where(within("friends")).count().as("a"). /* count the number of friends who liked the movie */
select("friends").count(local).where(eq("a")) /* compare to the number of total friends and */
) /* filter, if the counts don't match */
==>v[movie 2]
を今、あなたは俳優の名前を取得したい場合は、あなただけ追加する必要があります:
.in("play_in").dedup().values("name")
はどうもありがとうございました!私は数えることを考えましたが、そのようなクエリを書く方法を理解できませんでした!私は何をしようとしているのか非常に有望です!最後のことは、パフォーマンスの賢明なクエリを実行しない理由を参照してくださいか? –
かなりあなたのグラフに依存します。多くの友人(千人以上)または好きな人がたくさんいる場合、おそらくリアルタイムの結果を得ることはできません。しかし、この場合、ショートカットのエッジをあらかじめ計算することができますが、これは別のトピックです。 –