2012-11-05 1 views
2

Je construis actuellement un service web en utilisant python/flask et je voudrais construire ma couche de données au-dessus de neo4j, puisque ma structure de données de base est intrinsèquement un graphique. Je suis un peu confus par les différentes technologies offertes par neo4j pour ce cas. Surtout:en utilisant neo4J (serveur) de python avec transaction

1/J'avais initialement prévu d'utiliser l'Api REST via py2neo, mais le manque de transaction est un peu un problème.

2/La "base de données embarquée" neo4j ne semble pas très bien convenir à mon cas. Je pense que c'est utile lorsque vous travaillez avec des analyses par lots et ponctuelles, et que vous n'avez pas besoin de stocker la base de données sur un serveur différent du serveur Web. Je suis tombé sur le projet neo4django, mais je ne suis pas sûr que celui-ci offre un support de transaction (puisqu'il n'y a pas de client natif pour neo4j pour python), et si ce serait un problème de l'utiliser en dehors django lui-même. En fait, après avoir regardé la documentation du projet, j'ai l'impression qu'il a exactement les mêmes limites, pas de transaction (mais alors, comment pouvez-vous construire un service réel quand vous pouvez corrompre votre modèle sur un seul délai de connexion?) . Je ne comprends même pas quelle est l'utilité de ce projet.

Quelqu'un pourrait-il vous recommander quelque chose? Je me sens complètement coincé.

Merci

Répondre

5

Aucun des clients API REST seront en mesure de soutenir explicitement les transactions (propres) étant donné que cette fonctionnalité ne sont pas disponibles via l'interface API REST Neo4j. Il existe quelques alternatives telles que les requêtes Cypher et l'exécution par lots qui fonctionnent toutes dans une seule transaction atomique côté serveur; Cependant, mon approche générale pour les applications client est d'essayer de construire du code qui peut gérer avec élégance des données partiellement complètes, éliminant ainsi le besoin d'un contrôle explicite des transactions.

Souvent, cette approche fera un usage intensif de l'indexation unique et c'est une des raisons pour lesquelles j'ai fourni un grand nombre de méthodes de type "get_or_create" dans py2neo. Cypher lui-même est incroyablement puissant et fournit également des capacités d'unicité, en particulier grâce à la clause CREATE UNIQUE. En utilisant ceux-ci, vous pouvez rendre vos écritures idempotentes et vous pouvez pécher du côté de "le faire plus d'une fois" en sachant que vous ne finirez pas avec des données en double.

D'accord, cette approche ne vous donne pas de transactions en soi, mais dans la plupart des cas, elle peut vous donner un résultat final équivalent. Il est certainement intéressant de vous mettre au défi de savoir où dans vos transactions de demande sont vraiment nécessaire.

Hope this helps

Nigel

2

Je pense que neo4django fait usage de neo4j-rest-client, qui fait des opérations de soutien à travers le batch resource dans l'interface Neo4j REST.

La syntaxe est tout à fait similaire à celui utilisé par Neo4j Python emebedded API:

>>> n = gdb.nodes.create() 

>>> n["age"] = 25 

>>> n["place"] = "Houston" 

>>> n.properties 
{'age': 25, 'place': 'Houston'} 

>>> with gdb.transaction(): 
    ....:   n.delete("age") 
    ....: 

>>> n.properties 
{u'place': u'Houston'} 

Plus d'informations peuvent être trouvées dans la documentation Neo4j-repos-client au sujet transactions.

Questions connexes