2016-04-16 8 views
0

Ich frage mich, wie möglich ist, eine Gremlin-Abfrage, die Ergebnisse in einem verschachtelten Format zurückgibt. Angenommen, es gibt Eigenschaftsgraphen wie folgt:Verschachtelte Traversal Gremlin Abfrage für Titan db

USER und PAGE Ecken mit einigen Eigenschaften wie AGE für USER Scheitel;

FOLLOW Kante zwischen USER und PAGE;

Ich bin auf der Suche nach einer einzigen effizienten Abfrage, die alle Benutzer im Alter von mehr als 20 Jahren und alle folgenden Seiten von diesen Benutzern gibt. Ich kann das mit einer einfachen Schleife von der Anwendungsseite aus tun und pro Iteration eine einfache Traversal-Abfrage verwenden. Leider ist eine solche Lösung für mich nicht effizient, da sie viele Abfragen generiert und die Netzwerklatenz in diesem Fall sehr hoch ist.

Antwort

4

Nicht sicher, was Ihre Definition von "effizient" ist, aber denken Sie daran, dass dies ein typischer OLAP-Anwendungsfall ist und Sie keine schnellen OLTP-Echtzeitantworten erwarten sollten.

Das heißt, sollte die Abfrage so einfach sein wie:

g.V().has("USER", "AGE", gt(20)).as("user"). 
    map(out("FOLLOW").fold()).as("pages"). 
    select("user", "pages") 

Ein kleines Beispiel die moderne Probe Graph mit:

gremlin> g = TinkerFactory.createModern().traversal().withComputer() 
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], graphcomputer] 
gremlin> g.V().has("person", "age", gt(30)).as("user"). 
      map(out("created").fold()).as("projects"). 
      select("user","projects") 
==>[user:v[6], projects:[v[3]]] 
==>[user:v[4], projects:[v[5], v[3]]] 
+0

was für eine perfekte Antwort! aber Problem ist, dass, wenn ein Benutzer viele Benutzer folgt alle Benutzer auf Speicher geladen werden – pinokio

+0

@pinokio wahrscheinlich Limit() könnte eine Lösung in dieser Situation sein. –

+0

@Daniel Kuppitz Wie kann ich bestimmte Daten (z. B. Benutzername, Nachname usw.) von Benutzern/Projekten erhalten? – trojek

0

dies ist sehr einfach:

g.V().label('user').has('age',gt(20)) 
.match(__.as('user').out('follows').as('page')) 
.select('user','page') 

nur Aufmerksamkeit, wenn Sie diese Abfrage in Gremlin verwenden, Gremlin Ihnen Null-Zeiger Ausnahme gibt Sie es in Code verwenden können, und prüfen Sie, ob ‚Seite‘, dass existieren bekommen.