2016-04-09 11 views
0

Ich arbeite mit Titan Graph Datenbank (v1.0), und ich bin auf der Suche nach Gremlin Abfrage die gemeinsamen Freunde zwischen mehr als 2 Benutzern zu finden. Angenommen, ich habe einen "user1", "user2" und "user3". Ich möchte die gemeinsamen Freunde zwischen diesen 3 Benutzern finden. Ich weiß, dass die folgende Abfrage mir die gegenseitigen Freunde zwischen "user1" und "user2" gibt, aber wie kann ich die gegenseitigen Freunde zwischen mehr als 2 Benutzern finden? Ich weiß für zwei Benutzer kann ich die folgende Abfrage verwenden:Holen Sie sich eine Liste der gemeinsamen Freunde zwischen mehr als 2 Benutzern in Graph-Datenbank

g.V(user1).both("friend").where(both("friend").is(eq(user2))) 

Was ist mit mehr als 2 Benutzern? Ich weiß, dass ich das gleiche mit allen Paaren machen kann, aber das ist keine effiziente Abfrage!

Antwort

3

Der Schritt match() wird wahrscheinlich Ihre beste Wahl sein, da es am einfachsten zu lesen und zu schreiben ist. Könnte nicht der schnellste sein.

g.V().has("name","user1").as("u1"). 
    V().has("name","user2").as("u2"). 
    V().has("name","user3").as("u3"). 
    match(
    __.as("u1").both("friend").as("f"), 
    __.as("u2").both("friend").as("f"), 
    __.as("u3").both("friend").as("f") 
).where("f", neq("u1").and(neq("u2")).and(neq("u3"))).select("f") 

Hier ist die Abfrage in Aktion: http://www.gremlinbin.com/bin/view/570a30f9a58c9

Alternativ (ohne Mitte Traversal V() ‚s und ohne die where() Bedingungen) Sie tun können:

g.V().has("name","user1").both("friend").and(
    both("friend").has("name","user2"), 
    both("friend").has("name","user3")) 
+0

Ist das Teil“ .wo ("f", neq ("u1") und (neq ("u2")) und (neq ("u3"))) "ist notwendig? In meinem Datenmodell kann man kein Freund von sich sein. –

+0

'user1' kann ein Freund mit' user2' sein. Wenn Sie zulassen möchten, dass einer der Eingabebenutzer im Ergebnis angezeigt wird, brauchen Sie das 'where()' nicht. –

+0

Lieber Daniel, Wenn "user1" eine Freundschaftsbeziehung mit "user1" hat, sollte man "user1" aus dem Ergebnis ausschließen, aber wenn es im Datenmodell keine Selbstbeziehung gibt, muss "user1" nicht ausgeschlossen werden Ergebnis, da im Ergebnis kein "user1" enthalten ist. –