2013-06-15 2 views
6

Ich benutze Titan Server (Cassandra) v 0.3.1. Ich möchte einen Index für einen Vertexschlüssel/eine Eigenschaft erstellen, die ich bereits verwendet habe. Doch in ihren documentation, Titan erklärt, dass:Erstellen Sie einen Index für eine Vertex-Eigenschaft, die bereits in Titan (Cassandra) existiert?

To index vertices by key, the respective key index must be created before the key is first used in a vertex property.

Wenn ich versuche, einen Index auf einem Feld zu erstellen, die bereits vorhanden ist, ich einen Fehler sehen wie erwartet:

gremlin> g.createKeyIndex("my_key",Vertex.class) 
Cannot add an index to an already existing property key: my_key 

Aber selbst wenn ich versuchen, das Diagramm zu löschen, indem sie alle Ecken & Kanten zu entfernen, sehe ich den gleichen Fehler:

gremlin> g.E.remove() 
==>null 
gremlin> g.V.remove() 
==>null 
gremlin> g.createKeyIndex("my_key",Vertex.class) 
Cannot add an index to an already existing property key: my_key 

So scheint es, dass my_key in t andauert Der zugrunde liegende Datenspeicher bleibt auch nach dem Entfernen aller Grafikelemente erhalten. Dies steht im Einklang mit den Dokumenten (obwohl Elemente gelöscht wurden, die Eigenschaft wurde bereits "zuerst verwendet"), aber schien eine Spritze wert.

Mein nächster Schritt wird sein, einen neuen Cassandra-Datenspeicher zusammen neu zu erstellen, aber ich frage mich, ob es eine bessere Option gibt.

Was ist der einfachste Weg, einen Index für ein Feld zu erstellen, das bereits in Titan verwendet wurde?

Antwort

3

Zeigen Sie Titan auf einen neuen Cassandra-Datenspeicher und erstellen Sie den Index, bevor Sie Elemente mit dieser Eigenschaft einfügen.

gremlin> g.createKeyIndex("my_key",Vertex.class) 
==>null 
3

Versuchen Sie, diese Gremlin Abfrage:

gremlin> g.V.each{g.removeVertex(it)} 

Sie müssen keine Kanten manuell entfernen, denn wenn ein Knoten entfernt wird, werden alle damit verbundenen Kanten werden automatisch entfernt. Um alle Scheitelpunkte zu entfernen, müssen Sie eine Iterative Abfrage verwenden.

Sobald der Graph gelöscht ist, benötigen Sie keinen neuen KeySpace. Sie können dann verwenden:

gremlin> g.createKeyIndex("my_key",Vertex.class) 
+0

Vielen Dank für Ihre Antwort - leider scheint das nicht zu diesem Zweck zu tun. Ich denke 'g.V.each {g.removeVertex (it)}' ist grob äquivalent zu 'g.V.remove()' ([siehe related] (http://stackoverflow.com/a/17250723/2172530)). Als ich Ihre alternative Methode zum Entfernen von Scheitelpunkten ausprobierte, hatte Titan die gleiche Beschwerde: 'Ein Index zu einem bereits vorhandenen Eigenschaftsschlüssel kann nicht hinzugefügt werden: my_key'. – bcm360

+0

Haben Sie die Transaktion nach dem Entfernen festgeschrieben? – Pradatta

+0

Ich tat, kein Unterschied: 'Gremlin> g.V.each {g.removeVertex (it)}; g.commit(); g.createKeyIndex ("my_key", Vertex.class); Ein Index zu einem bereits vorhandenen Eigenschaftsschlüssel kann nicht hinzugefügt werden: my_key' – bcm360