2017-02-03 5 views
1

Ich habe eine Titandiagramm mit zwei Gruppen von Scheitelpunkten, eine für UserID und eine andere für Produkte. Die Kanten zwischen den UserID- und Product-Scheitelpunkten enthalten die "Daten", wenn Produkte gekauft wurden. Ich bin auf der Suche nach einer Gremlin-Abfrage, die mir eine Groupcount von Benutzer-IDs durch das letzte ProduktGremlin Abfrage für die Gruppenanzahl des letzten Wertes

Zum Beispiel gekauft geben kann, wenn die Daten haben wie unter

UserID,Date,Product 
A,2016-01-01,'Razor' 
A,2016-01-02,'Toothpaste' 
B,2016-02-01,'Toothpaste' 
B,2016-02-02,'Razor' 
C,2016-01-04,'Toothpaste' 

Ich bin für eine Ausgabe wie unten

Product, Count 
'Toothpaste',2 
'Razor',1 

Würde mich über jede Hilfe freuen.

Antwort

2

Die folgende Abfrage funktioniert in OLTP und OLAP und berührt nicht mehr Ecken als nötig:

g.V().hasLabel("User"). 
    local(outE("purchased").order().by("date", decr).limit(1)).inV(). 
    groupCount().by("name") 

Darüber hinaus kann diese Abfrage von Titan perfekt optimiert werden, wenn Sie einen vertexzentrischen Index auf date erstellen.

+0

Danke! Das funktioniert perfekt. Ich musste nur die Eigenschaftsnamen ändern, damit sie mit Jasons Code übereinstimmen. Auch danke für den Vorschlag auf den Vertex-Zentrik-Index - werde ich es auf der größeren Grafik versuchen, die ich habe. – Dhanesh

2

Diese Lösung funktioniert für Ihre Beispieldaten:.

gV() hasLabel ('Produkt'), wie ('p') ine ('Kaufen') order() durch (‘.... '.) Groupcount() durch ('Datum‘.., decr) .OUTV() dedup() wählen (' p-Name')

Dies ist der Algorithmus:

  • Start ab die Produkte
  • Überqueren Sie die Kaufkanten
  • Bestellen Sie die Kanten nach dem Datum absteigend
  • Traverse an die Benutzer
  • Dedup den Benutzer; nur die letzte Kante pro Benutzer wird wegen
  • Sprung zurück zu den Produkten bleiben Sortierung
  • Gruppe Zählung nach Produktnamen

Hier ist ein Gremlin Console-Dump es in Aktion zeigt:

gremlin> graph = TinkerGraph.open() 
==>tinkergraph[vertices:0 edges:0] 
gremlin> a = graph.addVertex(T.label, 'User', 'UserID', 'A') 
==>v[0] 
gremlin> b = graph.addVertex(T.label, 'User', 'UserID', 'B') 
==>v[2] 
gremlin> c = graph.addVertex(T.label, 'User', 'UserID', 'C') 
==>v[4] 
gremlin> r = graph.addVertex(T.label, 'Product', 'Name', 'Razor') 
==>v[6] 
gremlin> t = graph.addVertex(T.label, 'Product', 'Name', 'Toothpaste') 
==>v[8] 
gremlin> a.addEdge('Purchase', r, 'Date', new Date(2016, 0, 1)) 
==>e[10][0-Purchase->6] 
gremlin> a.addEdge('Purchase', t, 'Date', new Date(2016, 0, 2)) 
==>e[11][0-Purchase->8] 
gremlin> b.addEdge('Purchase', t, 'Date', new Date(2016, 1, 1)) 
==>e[12][2-Purchase->8] 
gremlin> b.addEdge('Purchase', r, 'Date', new Date(2016, 1, 2)) 
==>e[13][2-Purchase->6] 
gremlin> c.addEdge('Purchase', t, 'Date', new Date(2016, 0, 4)) 
==>e[14][4-Purchase->8] 
gremlin> g = graph.traversal() 
==>graphtraversalsource[tinkergraph[vertices:5 edges:5], standard] 
gremlin> g.V().hasLabel('Product').as('p').inE('Purchase').order().by('Date', decr).outV().dedup().select('p').groupCount().by('Name') 
==>[Toothpaste:2,Razor:1] 
+0

Vielen Dank. Dies funktioniert für mich im OLTP-Modus wie Sie es getan haben. Aber ich bekomme einen Fehler 'Globale Traversalen auf GraphComputer dürfen keine Mid-Traversal-Barrieren enthalten: OrderGlobalStep ([decr (Date)])' im OLAP-Modus, d. H. 'G = graph.traversal (computer())'. Ich muss etwas Ähnliches auf einem sehr großen Graphen ausführen - es wird großartig sein, wenn Sie irgendwelche Zeiger haben. Ich laufe titan-1.0.0-hadoop1 Version – Dhanesh

Verwandte Themen