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]
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