2017-04-27 5 views
0

Ich verwende derzeit Tinkerpop mit der gremlin python client mit der Standardeinstellung TinkerGraph-Gremlin (die im Speicher ausgeführt wird). Ich wollte die Leistung meiner Abfragen erhöhen und las über die createIndex() Funktion, die klingt wie die perfekte für meinen Anwendungsfall, leider konnte ich keinen Index mit dem Python-Client erstellen. Ich habe auch versucht, diese Zeilen in das Start-up-Groovy-Skript einzufügen (durch den groovy scirpt ohne Fehler zu laufen), aber wenn ich meine Performance-Benchmarks starte, bekomme ich die gleichen Ergebnisse.Gremlin Python createIndex (Tinkerpop)

Also meine Frage ist: Kann ich einen Index mit dem Python-Client erstellen und wenn nicht, was wäre eine Problemumgehung? Gibt es auch eine Möglichkeit, Gremlin zu fragen, ob irgendwelche Indizes definiert sind?

PS .: Für die groovy Skript verwenden ich die Standard-empty-sample.grooy und diese Zeilen vor dem letzten Aufruf hinzu:

graph.createIndex("name", Vertex.class) 
graph.createIndex("nap", Edge.class) 

Dank!

+0

Beide Ansätze sollten funktionieren. aus Neugier, wie groß ist Ihr Graph? –

+0

@stephenmallette Das Problem ist, dass im Python-Client die createIndex() -Methode fehlt (soweit ich das beurteilen kann). Und das Hinzufügen der zwei Zeilen in das Groovy-Skript führt zu denselben Abfragezeiten. Über 8000 Eckpunkte. –

Antwort

1

Der Python-Client hat keine createIndex()-Methode, da TinkerPop keine Abstraktionen über Indizes in 3.x bietet. Wir stützen uns auf die Index- und Schemaerstellungsmethoden der zugrunde liegenden Graphdatenbank. Sie müssen auf diese API-Ebene und aus TinkerPop herausfallen.

Wenn Sie nur bestimmen, ob Indizes mit der Geschwindigkeit Ihrer Abfrage erstellt werden, beachten Sie, dass Ihr Diagramm nur 8800 Scheitelpunkte enthält und TinkerGraph ein Diagramm im Speicher ist. Sie sehen möglicherweise keinen massiv erkennbaren Unterschied in der Geschwindigkeit mit diesen wenigen Eckpunkten. Wenn Sie wissen wollen, ob Ihr Index aussehen es erstellt wird gerade nach oben:

gremlin> graph = TinkerGraph.open() 
==>tinkergraph[vertices:0 edges:0] 
gremlin> g = graph.traversal() 
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard] 
gremlin> graph.createIndex('name',Vertex.class) 
gremlin> graph.getIndexedKeys(Vertex.class) 
==>name 
+0

Danke für Ihre schnelle Antwort! Ich überprüfte das Diagramm erneut: 'g.V(). Count(). Next() 16000' und' g.E(). Count(). Next() 31000'. Eine letzte Frage: Wenn ich einen Index für 'name' erstellt habe, sollte ich' name' immer zuerst mit einem 'has ('name', xxx)' Statement wählen? –

+0

Mit TinkerGraph sollten Sie Ihre selektivste indizierte Eigenschaft zuerst setzen. Andere Graphen verhalten sich möglicherweise anders und machen einen besseren Job, indem sie eine Reihe von 'has()' Schritten optimieren. –

0

Mit gremlinpython v3.2.6

Suche im Github von TinkerPop, fand ich können Sie direkte Anfragen senden, wie es die Datenbank-Konsole war Verwenden des Clientobjekts. Dieses Verhalten wird in the GitHub of Tinkerpop erläutert. Ich werde die synchrone Version zeigen, in der GitHub gibt es eine asynchrone man auch:

from gremlin_python.driver.client import Client 

client = Client(url, travelsal_source) 
console_command_string = "2*2" # Write code as it was the console of the database you're using 
result_set = client.submit(console_command_string) 
future_results = result_set.all() 
results = future_results.result() 

client.close() 

Um zu sehen, was befehlen Sie zu senden, Blick auf die genaue Datenbank Sie verwenden, bei Janusgraph es detaillierte in its indexing documentation.

Verwandte Themen