2016-12-09 9 views
0

Попытка добавления узлов и отношений транзакционным способом с использованием py2neo V3. Я хотел бы добавить человека и все их фильмы как одну транзакцию.Py2neo V3, добавляющий отношения к транзакциям в цикле

Я не мог заставить узлы во внешней и внутренней петлях работать в одной транзакции. Я уверен, что отношения не добавляются транзакционным способом, так как я вызываю tx1.graph.

Neo4j V3.0.7 Py2Neo v3.1.2

from py2neo import Graph,Node,Relationship,authenticate, watch 
from py2neo.ogm import GraphObject, Property, RelatedTo, RelatedFrom 

class Movie(GraphObject): 
    __primarykey__ = "title" 

    title = Property() 

class Person(GraphObject): 
    __primarykey__ = "name" 

    name = Property() 

    acted_in = RelatedTo(Movie) 

People = ["John","Jane","Tarzan"] 
Movies = [["John","Movie1"],["John","Move2"],["Jane","Movie3"],["Jane","Movie4"],["Tarzan","Movie4"]] 
graph = Graph("http://localhost:7474") 

for p in People: 
    print(p) 
    tx = graph.begin() 
    p1 = Person() 
    p1.name = p 
    tx.merge(p1) 
    tx.commit() 
    for m in Movies: 
     if m[0] != p: 
      continue 
     print(m[1]) 
     tx1 = graph.begin() #did not work using original tx transaction 
     m1 = Movie() 
     m1.title = m[1] 
     tx1.merge(m1)  
     p1.acted_in.add(m1) 
     #tx1.merge(p1) #did not create relationship 
     #tx1.create(p1) #did not create relationship 
     tx1.graph.push(p1) # worked in adding relationship, but can't guarantee was part of the transaction 
     tx1.commit() 

ответ

1

Попробуйте следующий цикл, который использует одну транзакцию для каждого Person и его отношений:

for p in People: 
    print(p) 
    tx = graph.begin() 
    p1 = Person() 
    p1.name = p 
    tx.merge(p1) 
    for m in Movies: 
     if m[0] != p: 
      continue 
     print(m[1]) 
     m1 = Movie() 
     m1.title = m[1] 
     tx.merge(m1)  
     p1.acted_in.add(m1) 
     tx.graph.push(p1) 
    tx.commit() 

Примечание: Это будет фактически более эффективно использовать одну транзакцию для обработки нескольких лиц. Но вы не хотели бы обрабатывать слишком много (в зависимости от вашей модели данных) одновременно, так как это может привести к тому, что у сервера закончится нехватка памяти.