2013-09-06 3 views
0

J'utilise py2neo (v 1.9.2) pour écrire des données dans un neo4j db.py2neo: insertion par lots en fonction

batch = neo4j.WriteBatch(graph_db) 
current_relationship_index = graph_db.get_or_create_index(neo4j.Relationship, "Current_Relationship") 
touched_relationship_index = graph_db.get_or_create_index(neo4j.Relationship, "Touched_Relationship") 
get_rel = current_relationship_index.get(some_key1, some_value1) 
if len(get_rel) == 1: 
    batch.add_indexed_relationship(touched_relationship_index, some_key2, some_value2, get_rel[0]) 
elif len(get_rel) == 0: 
    created_rel = current_relationship_index.create(some_key3, some_value3, (my_start_node, "KNOWS", my_end_node)) 
    batch.add_indexed_relationship(touched_relationship_index, some_key4, "touched", created_rel) 
batch.submit() 

Est-il possible de remplacer current_relationship_index.get (..) et current_relationship_index.create (...) avec une commande de lot? Je sais qu'il y en a un, mais le problème est que j'ai besoin d'agir en fonction du retour de ces commandes. Et je voudrais avoir toutes les déclarations dans un lot en raison de la performance. J'ai lu qu'il est plutôt rare d'indexer les relations mais la raison pour laquelle je le fais est la suivante: J'ai besoin d'analyser un fichier (texte) tous les jours et ensuite besoin de vérifier si l'une des relations a changé vers la précédente day, c'est-à-dire si une relation n'existe plus dans le fichier texte, je veux la marquer avec une propriété "replace" dans neo4j. Par conséquent, j'ajoute toutes les relations «touchées» à l'index approprié, donc je sais que celles-ci n'ont pas changé. De toute évidence, toutes les relations qui ne sont pas dans l'index_relation_relatif n'existe plus, donc je peux les marquer.

Je ne peux pas penser à un moyen plus facile de le faire, même si je suis sûr que py2neo en offre un.

EDIT: Vu le commentaire de Nigel j'ai essayé ceci:

my_rel = batch.get_or_create_indexed_relationship(current_relationship_index, some_key, some_value, my_start_node, my_type, my_end_node) 
batch.add_indexed_relationship(touched_relationship_index, some_key2, some_value2, my_rel) 
batch.submit() 

Cela ne fonctionne évidemment pas, parce que je ne peux pas faire référence dans le lot « my_rel ». Comment puis-je resoudre ceci? Référez-vous avec "0" au résultat de l'instruction de lot précédente? Mais considérons que le tout est supposé fonctionner en boucle, donc les nombres ne sont pas fixés. Peut-être utiliser une variable "batch_counter" qui se réfère à l'instruction batch actuelle et est toujours incrémentée, à chaque fois qu'une instruction est ajoutée au batch ??

Répondre

0

Jetez un oeil à WriteBatch.get_or_create_indexed_relationship. Cela peut conditionnellement créer une relation basée sur le fait que l'un existe ou non et fonctionne de manière atomique. lien Documentation ci-dessous:

http://book.py2neo.org/en/latest/batches/#py2neo.neo4j.WriteBatch.get_or_create_indexed_relationship

Il y a quelques installations de gestion similaires à caractère unique py2neo que j'ai récemment blogué sur here que vous pouvez lire.

+0

Merci Nigel, j'apprécie vraiment votre travail. Cependant, je n'arrive toujours pas à comprendre comment. Mon approche était la suivante: my_rel = batch_add_relation.get_or_create_indexed_relationship (current_relationship_index, some_key, some_value, my_start_node, my_type, my_end_node) batch_add_relation.add_indexed_relationship (touched_relationship_index, some_key2, some_value2, my_rel) Cela ne fonctionne évidemment pas, parce que je ne peux pas reportez-vous à "my_rel" dans le lot. Comment puis-je resoudre ceci? Référez-vous avec "0" au résultat de l'instruction de lot précédente? Mais considérez cela comme une boucle, donc les nombres ne sont pas corrigés – user2752625

+0

Jetez un oeil à l'édition de mon message original pour une meilleure vue d'ensemble – user2752625

+0

Beaucoup de méthodes batch dans 1.5 permettent des références numériques à d'autres éléments dans ce lot, donc '0' se réfère au résultat de la première demande de lot. Dans la version 1.6, les valeurs de retour peuvent être utilisées dans le même but (http://book.py2neo.org/en/release-1.6.0/batches/#py2neo.neo4j.WriteBatch.create) –

Questions connexes