2016-08-30 1 views
0

Je souhaite créer un nœud/une relation uniquement si un nœud/une relation avec le même attribut s n'existe pas dans le graphique. Si c'est le cas, je voudrais aller chercher l'objet concerné. En ce moment, je fais quelque chose que je suppose est à la fois unidiomatic et inefficace. En supposant que chaque noeud Person a une unique paire (name, age), je fais quelque chose comme ceci:Comment puis-je effectuer une opération de "correspondance ou création" dans py2neo v3?

try: 
    node = graph.data('MATCH (n:Person) WHERE n.name = {name} AND' 
         'n.age = {age} RETURN n LIMIT 1', 
         name=my_name, age=my_age)[0]['n'] 
except IndexError: 
    node = Node('Person', name=my_name, age=my_age) 

Pour ma compréhension find_one() ne fonctionne que si vous avez juste une propriété à rechercher et match_one() permet pas de propriétés pour les relations .

Répondre

1

Vous pouvez utiliser la clause MERGE Cypher pour effectuer une « correspondance ou créer »:

node = graph.data('MERGE (n:Person) WHERE n.name = {name} AND' 
        'n.age = {age} RETURN n LIMIT 1', 
        name=my_name, age=my_age)[0]['n'] 

py2neo ne merge et merge_one fonctions, mais ils prennent seulement une seule propriété, donc en utilisant Cypher serait plus approche générale.