2016-04-11 15 views
1

Ich werde den gesamten Wert der Listeneigenschaft aktualisieren und einen neuen Wert dafür in Titan 1.0 setzen, für einzelne Kardinalität kann ich vertex.property("single_property",new_value) verwenden und das Ganze überschreiben Wert, aber für die Kardinalität vom Typ Liste wird der neue Wert zur Eigenschaft hinzugefügt (es überschreibt nicht den ganzen Wert). Außerdem, wenn ich die Eigenschaft entferne und einen neuen Wert hinzufüge, scheint es in der gleichen Transaktion, dass die gesamte Operation von Titan ignoriert wird! Daher meine Frage wäre, wie kann ich den gesamten Wert der Liste Eigenschaft in angemessener Weise aktualisieren?Aktualisierung des gesamten Wertes der Vertex-Eigenschaft mit List-Kardinalität in der Titeldatenbank-Datenbank

In Bezug auf die von Phani zur Verfügung gestellte Lösung funktionierte der folgende Code nicht für mich, der Einfügeteil funktionierte, aber der Löschteil nicht.

keywords = keywordExtractor.getKeywords(getId(nextVertex)) 
if (keywords.size() > 0) { 
    nextVertex.property(VertexProperty.Cardinality.single, "post_keyword", keywords.get(0)); 
    keywords.remove(0); 
      for (String keyword : keywords) { 
        nextVertex.property(VertexProperty.Cardinality.list, "post_keyword", keyword); 
      } 
} 
nextVertex.graph().tx().commit(); 

Auch die von Jason angebotene Lösung, die im Folgenden bereitgestellt wird, hat auch nicht funktioniert. Das Problem war im Löschteil.

keywords = keywordExtractor.getKeywords(getId(nextVertex)) 
    if (keywords.size() > 0) { 
     nextVertex.graph().traversal().V(nextVertex).properties("post_keyword").drop().iterate(); 
       for (String keyword : keywords) { 
         nextVertex.property("post_keyword", keyword); 
       } 
    } 
    nextVertex.graph().tx().commit(); 

Ich habe auch die folgende Lösung untersucht; hat auch nicht funktioniert.

keywords = keywordExtractor.getKeywords(getId(nextVertex)) 
    if (keywords.size() > 0) { 
     Iterator<VertexProperty<Object>> iter = nextVertex.properties("post_keyword"); 
     while(iter.hasNext()){ 
       iter.next().remove(); 
     } 
     for (String keyword : keywords) { 
       nextVertex.property("post_keyword", keyword); 
     } 
    } 
    nextVertex.graph().tx().commit(); 

Antwort

0

Alle Ansätze vorgesehen, die an der Hauptfrage präsentiert werden, können als Lösung zur Aktualisierung des Verzeichnisses/set Mächtigkeit Eigenschaft ganzen Wert verwendet werden. Es gibt jedoch eine Tatsache, die berücksichtigt werden sollte, um eine funktionierende Lösung zu haben.

In Titan 1.0, wenn Sie die Backend-Indizierung (wie ES oder Solr) in einer einzigen Transaktion verwenden, werden alle Hinzufügungen und Löschvorgänge untersucht, um unnötige Löschvorgänge zu finden. Irgendwie wird das Löschen einer Eigenschaft und das Hinzufügen derselben Eigenschaft in der Titan-Mutationsklasse konsolidiert, und folglich wird die Löschoperation ignoriert. Für eine einzelne Kardinalität ist eine solche Ignoranz kein Problem, da der gesamte Wert durch Hinzufügung am Indizierungs-Backend überschrieben wird, aber für die Kardinalität von Listen/Mengen führt dies zu einer Inkonsistenz der Backend-Indizierungsdaten.

Angenommen, es gibt eine Eigenschaftslöschung und denselben Eigenschaftszusatz für die Kardinalitätseigenschaft List/Set in der Einzeltitantransaktion. Nach der Übergabe des Teils zeigt gremlin query, dass die gesamte Eigenschaft überschrieben wird. Wenn Sie jedoch das Indexierungs-Backend überprüfen, werden Sie feststellen, dass die neue Eigenschaft zur alten Eigenschaft hinzugefügt wird. Aus der Perspektive von Titan wird die Operation zum Entfernen der Eigenschaft konsolidiert, um die unnötige Löschung zu entfernen! Es gibt zwei Lösungen für dieses Problem, entweder entfernen Sie die consolidation Methode aus der Mutation Klasse in Titan (dies wird eine unnötige Operation in einzelnen Kardinalität Situation verursachen), oder verwenden Sie mehrere Transaktionen für Hinzufügen und Löschen von Operationen. Ich habe die zweite Lösung gewählt.

0

Sie würden verwenden Cardinality list in der Multi-Property zusätzliche Eigenschaften hinzuzufügen. Wenn Sie vorhandene Werte eines Multi-Eigenschaft entfernen möchten, und neue Liste hinzugefügt haben, können Sie wie folgt vorgehen:

gremlin> v = g.addV('name','marko','name','marko a. rodriguez').next() 
==>v[0] 
gremlin> g.V(v).properties('name').count() //(1) 
==>2 
gremlin> v.property(list, 'name', 'm. a. rodriguez') //(2) 
==>vp[name->m. a. rodriguez] 
gremlin> g.V(v).properties('name').count() 
==>3 
gremlin> g.V(v).property('name','okram') //(3) 
==>v[0] 
gremlin> g.V(v).properties('name') 
==>vp[name->okram] 
gremlin> g.V(v).values('name') //(4) 
==>okram 

1 => Sie Addv mit mehreren Eigenschaften mit demselben Namen verwendet, daher ist die Anzahl 2

2 => Um einem vorhandenen Vertex mit vorhandenen Einträgen zusätzliche Namenseigenschaften hinzuzufügen, würden Sie die Kardinalität als Liste angeben. Dies wird den neuen Namen in die Liste der verfügbaren Namen

3 => anhängen alle vorhandenen Namenseinträge zu entfernen und einen neuen Eintrag hinzuzufügen, würden Sie einfach die Mächtigkeit der Methode property auslassen

4 => Sie daher kann nur einen Namen für den gleichen Knoten sehen.

+0

Leider hat Ihre Lösung nicht für mich funktioniert. –

0

Phani bot eine solide Antwort, die gut mit TinkerGraph funktioniert. Das Verhalten in Titan ist etwas anders, also ist mein Vorschlag drop() die Eigenschaft zuerst, dann fügen Sie neue Elemente danach hinzu.

gremlin> graph = TitanFactory.open('inmemory'); g = graph.traversal() 
==>graphtraversalsource[standardtitangraph[inmemory:[127.0.0.1]], standard] 
gremlin> mgmt = graph.openManagement() 
==>com.t[email protected]71a06021 
gremlin> name = mgmt.makePropertyKey('name').dataType(String.class).cardinality(Cardinality.LIST).make() 
==>name 
gremlin> mgmt.commit() 
==>null 
gremlin> v = g.addV('name','marko','name','marko a. rodriguez').next() 
==>v[4312] 
gremlin> g.V(v).properties('name').count() 
==>2 
gremlin> g.V(v).properties('name').drop().iterate() 
gremlin> g.V(v).properties('name').count() 
==>0 
gremlin> v.property(list, 'name', 'm. a. rodriguez') 
==>vp[name->m. a. rodriguez] 
gremlin> g.V(v).properties('name').count() 
==>1 

Aktualisiert: Java code example

+0

Funktioniert es auch in Java-Client? –

+0

Ja, natürlich. –

+0

Leider funktioniert es in meinem Fall nicht. –

Verwandte Themen