2016-12-09 27 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() 

注:它實際上是使用單個事務處理多個人更有效率。但是,您不希望同時處理太多(取決於您的數據模型),因爲這可能會導致服務器內存不足。