2017-02-07 4 views
0

방금 ​​py2neo와 neo4j를 배우기 시작했고, 나는이 중복 문제를 겪고 있습니다. 파이썬으로 과학 논문과 저자의 데이터베이스를 만드는 간단한 파이썬 스크립트를 작성하고 있습니다. 나는 논문과 저자의 노드를 추가하고 그들의 관계를 추가하기 만하면된다.py2neo transaction commit duplicate

paper = Node('Paper', id=post_id) 
    graph.merge(paper) 
    paper['created_time'] = created_time 
    graph.push(paper) 

    for author_id,author_name in paper_dict['authors']: 
     researcher = Node('Person', id=author_id) 
     graph.merge(researcher) 
     researcher['name'] = author_name 
     graph.push(researcher) 

     wrote = Relationship(researcher,'author', paper) 
     graph.merge(wrote) 

그래서, 동시에 여러 관계를 쓰기 위해, 내가 트랜잭션을 사용하려고 해요 : 나는 잘 작동하지만, 아주 느린이 코드를 사용했다. 내 문제는 만약 내가 동일한 논문과 작가에 대해 여러 번 실행한다면, 그들은 서로 다른 엔티티라고 가정하고 데이터베이스의 각 노드와 관계를 복제한다 (나는 여러 번 scrip을 실행하려고 시도했다). 이전 코드에서도 마찬가지입니다. 이 트랜잭션을 사용하는 코드입니다 :

tx = graph.begin() 

    paper = Node('Paper', id=post_id) 
    paper['created_time'] = created_time 

    tx.create(paper) 

    for author_id,author_name in paper_dict['authors']: 
     researcher = Node('Person', id=author_id) 
     researcher['name'] = author_name 
     tx.create(researcher) 
     wrote = Relationship(researcher,'author', paper) 
     tx.create(wrote) 
    tx.commit() 

답변

1

난 당신이 병합 기능을 사용한다고 생각은하고 중복을 피하기 위해 기능을 만들 수 없습니다. 다음 소스 코드를 고려하십시오.

import py2neo 

    from py2neo import Graph, Node, Relationship 

    def authenticateAndConnect(): 
     py2neo.authenticate('localhost:7474', 'user', 'password') 
     return Graph('http://localhost:7474/default.graphdb/data/')  

    def actorsDictionary(): 
     return 

    def createData(): 
     graph = authenticateAndConnect() 
     tx = graph.begin() 
     movie = Node('Movie', title='Answer') 

     personDictionary = [{'name':'Dan', 'born':2001}, {'name':'Brown', 'born':2001}] 
     for i in range(10): 
     for person in personDictionary: 
      person = Node('Person', name=person['name'], born=person['born']) 
      tx.merge(person) 
      actedIn = Relationship(person, 'ACTED_IN', movie) 
      tx.merge(actedIn) 

     tx.commit() 

    if __name__ == '__main__': 
     for i in range(10): 
      createData() 
관련 문제