2016-08-23 3 views
1

g.V().hasLabel('Person').count() gibt mir die Anzahl der Person Vertices in meiner Datenbank, und g.V().hasLabel('Person').range(10,15) gibt mir eine Reihe von Person Vertices.So erhalten Sie die Anzahl und den Bereich in der gleichen Gremlin Abfrage

Aber gibt es eine Möglichkeit, diese beiden zu einer einzigen Gremlin-Abfrage zu kombinieren?

Dies ist nur eine vereinfachte Version meiner Abfrage, aber meine eigentliche Abfrage ist ruhig komplex und die Anzahl der Durchläufe zu wiederholen, nur um die Anzahl zu finden, scheinen unwirksam!

Antwort

0

Ich erkannte gerade, ich könnte groovy mit Gremlin verwenden, um zu erreichen, was ich will. Nicht sicher, wie elegant das ist!

def lst = g.V().hasLabel('Person').toList(); def result = ["count":0, "data":[] ]; result.count=lst.size();result.data=lst[2..3];result

Dies funktioniert groß, auch in meinem komplexen Fall.

+1

Sie sollten Schritte mit Gremlin bevorzugen , dh. 'count()' und 'range()' Schritte, damit der Abfrageoptimierer eingreifen kann. – jbmusso

+0

Vielen Dank für den Vorschlag, können Sie mir bitte mit einer Antwort helfen? – Phani

2

Ich würde nicht empfehlen, eine volle count() in jeder Abfrage zu tun. Zählen Sie die Gesamtanzahl einmal und speichern Sie sie in Ihrer Anwendung.

Das heißt, hier ist, wie Sie es trotzdem tun könnte:

g.V().hasLabel('Person').aggregate('x').cap('x'). 
    project('page3', 'total').by(range(local, 10, 15)).by(count(local)) 

UPDATE:

In älteren Versionen können Sie dies versuchen:

g.V().hasLabel('Person').aggregate('x').cap('x').as('page3', 'total'). 
    select('page3', 'total').by(range(local, 10, 15)).by(count(local)) 
+0

Danke Daniel für die Antwort, aber wenn ich das versuchte, bekomme ich: 'Keine Signatur der Methode: org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.project() ist für Argumenttypen anwendbar: (java.lang.String, java.lang.String) Werte: [page3, total] Mögliche Lösungen: reset(), collect(), toSet(), inspect(), sort(), inject (groovy.lang. Closure) Display Stack Trace? [yN] ' – Phani

+0

Ich verwende titan11 Zweig mit Tinkerpop 3.1.1-Inkubation – Phani

+0

Ich plane nicht, die Zählung in der Anwendung zu cachen, weil die Daten transaktional sind und die Zählung wird veraltet, sobald ich es in der ersten Antwort diene ! Daher müsste ich jedesmal eine volle Zählung vornehmen. Außerdem ist dies eine Beispielabfrage, und die tatsächliche Anzahl der Scheitelpunkte/Kanten, die ich in voller Anzahl durchlaufen würde, wäre aufgrund der angewendeten Filter geringer. – Phani

Verwandte Themen