2016-07-07 10 views
0

Ich verwende py2neo (mit der Relationship.push() -Methode), um die Eigenschaften bestehender Beziehungen zu aktualisieren. Die Beziehungseigenschaften werden erfolgreich aktualisiert, aber die zugehörigen Knoten werden von allen ihren Eigenschaften geleert. Ist das Standardverhalten?py2neo Beziehung push Leergutknoten

Danke.

Antwort

0

Ich bin nicht in der Lage zu erstellen, was Sie den Code unten beschreiben mit:

>>> from py2neo import * 
>>> graph = Graph(password="p4ssw0rd") 
>>> a = Node(name="Alice") 
>>> b = Node(name="Bob") 
>>> ab = Relationship(a, "KNOWS", b) 
>>> graph.create(ab) 
>>> remote(a)._id 
1 
>>> graph.evaluate("MATCH (n) WHERE id(n) = {x} RETURN n", x=1) 
(alice {name:"Alice"}) 
>>> ab["since"] = 1999 
>>> graph.push(ab) 
>>> graph.evaluate("MATCH (n) WHERE id(n) = {x} RETURN n", x=1) 
(alice {name:"Alice"}) 

das gesagt ist, bedenken Sie, dass, was Sie beschreiben, wie eine Beziehung drückt in der Tat ist die gesamte Subgraphen des bestehend drängen Beziehung plus seine Start- und Endknoten. Wenn daher die lokalen Kopien dieser Knoten keine Eigenschaften enthalten, wird dies als ein Signal zum Aktualisieren der entfernten Knoten angesehen, indem die entfernten Eigenschaften entfernt werden.

Aufgrund dieses Verhaltens des gesamten Untergraphenupdates müssen Sie sicherstellen, dass die lokalen Kopien Ihrer Knoten aktuell sind, bevor Sie sie verschieben. Vielleicht indem man sie zuerst zieht. Es gibt keine API-Operation auf höherer Ebene, um die Beziehung nur zu pushen und die Knoten zu ignorieren. Diese Operationen funktionieren auf ganzen Untergraphen. Um es anders zu machen, müssen Sie Cypher besuchen.

+0

Dank Nigel, das macht Sinn, da ich keine lokalen Kopien der zugehörigen Knoten haben. Es ist schade, dass ich die Beziehung nicht einfach aktualisieren kann, weil ich einen regelmäßigen Prozess implementiere, um alte Daten zeitabhängig zu entfernen. Wenn ich die Knoten jeder Beziehung, die ich aktualisieren muss, ziehen muss, könnte das teuer werden. Also Cypher ist es. Danke noch einmal. –

+0

Beachten Sie, dass die Cypher dafür ziemlich einfach sein sollte. So etwas wie 'graph.run (" MATCH() - [r] ->() WHERE id (r) = {x} SET r = {p} ", x = 123, p = {" foo ":" bar " }) '. Alternativ können Sie den Operator '+ =' verwenden, wenn Sie eine neue Gruppe von Eigenschaften zusammenführen möchten, anstatt sie zu ersetzen: 'graph.run (" MATCH() - [r] ->() WHERE id (r) = {x} SET r + = {p} ", x = 123, p = {" foo ":" Balken "})'. –