Die aktuelle Version von py2neo
ermöglicht nicht für 'Beziehungsobjekte', die Sie Parameter setzen könnte auf eine Beziehung in der Standard-OOP-y-Weise.
Die OGM ist sehr nützlich für den Einstieg in ein Projekt, und für schnelle Einfügen/Retrieval-Transaktionen, aber für die meisten komplexeren Transaktionen, sollten Sie schreiben, um Ihr Ziel zu erreichen.
Oft möchten Sie jedoch diese Abfragen auf einem GraphObject
organisieren, und manchmal können Sie GraphObject
erweitern, um eine Methode hinzuzufügen, um einige erforderliche Funktionalität bereitzustellen.
In Ihrem Anwendungsfall möchten Sie vielleicht einige Methoden hinzufügen, um Ihre Beziehungseigenschaften zu erhalten oder einzustellen. Ich habe eine kurze Demo zum Abrufen der Eigenschaften der Beziehung geschrieben. Sie können auch eine ähnliche Methode zum Festlegen der Beziehung hinzufügen.
from py2neo.ogm import (GraphObject,
INCOMING,
OUTGOING,
Property,
RelatedFrom,
RelatedTo,)
# this function makes this kind of thing tonnes easier
from py2neo.types import remote
class GraphObjectWithRelProps(GraphObject):
"""Simple extension to add get method for a relationship
between self and another node"""
@staticmethod
def _get_relationship(source, target, relationship):
"""Returns the relationship connecting source and target as set
in the class definition.
Copy this method, adding an argument for the params
and altering the cypher to add a set function
Only works if two classes are rleated by only one relationship
:param source: GraphObject instance - the starting node
:param target: GraphObject instance - the ending node
:param relationship: str name of the relationship on source"""
# get relationship pattern
rel = getattr(source, relationship)
# the pattern is calculated for us on this object
pattern = rel._RelatedObjects__relationship_pattern
# basic cypher query
q = ('MATCH {0} '
'WHERE id(a) = $sId AND id(b) = $tId '
'RETURN _').format(pattern)
# for a set operation you would add
# DELETE _ CREATE {0} SET _ += $relParams
# where $relParams is supplied as a dict with your params
# you could also add a patch method using _ += $relParams
# the remote function allows us to get a reference to the graph
graph = remote(source.__ogm__.node).graph
# as well as the node IDs of the GraphObject
params = {
'sId': remote(source.__ogm__.node)._id,
'tId': remote(target.__ogm__.node)._id,
}
return graph.run(q, params).evaluate()
class Intent(GraphObjectWithRelProps):
name = Property()
message = RelatedTo("Message", "HAS")
def get_message_rel(self, n):
graph = remote(self.__ogm__.node).graph
return self._get_relationship(graph, self, n, 'message')
class Message(GraphObjectWithRelProps):
name = Property()
owner = RelatedFrom("Intent","HAS")
def get_owner_rel(self, n):
graph = remote(self.__ogm__.node).graph
return self._get_relationship(graph, self, n, 'owner')
Dank Dom Weldon. Werde das versuchen. Noch eine Frage: Werden Beziehungen in Zukunft als Objekte unterstützt? –
So das neueste Update über die Zukunft von py2neo ist am besten aus diesem Problem entnommen https://github.com/technige/py2neo/issues/631 –
Wenn ich meine heiße nehmen würde, py2neo und die OGM ist ein ausgezeichnetes Werkzeug für sich mit Graphen vertraut machen, wenn Sie mit relationalen Python- und/oder Objekt-Mappings vertraut sind. Wenn Sie Diagramme ernst nehmen und sie für die Analyse oder Produktion verwenden wollen, müssen Sie eine Chiffre schreiben. Es ist eine großartige Sprache, und es ist Open-Source, damit man es in den Griff bekommt und man wird weg sein. –