2017-02-07 2 views
0

Ich fing gerade an, py2neo und neo4j zu lernen, und ich habe dieses Problem der Duplikate. Ich schreibe ein einfaches Python-Skript in Python, das eine Datenbank mit wissenschaftlichen Arbeiten und Autoren erstellt. Ich muss nur die Knoten von Papieren und Autoren hinzufügen und ihre Beziehung hinzufügen. Ich war mit diesem Code, das funktioniert gut, ist aber sehr langsam:py2neo transaction commit duplizieren

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) 

Also, um mehrere Beziehungen gleichzeitig zu schreiben, ich versuche Transaktion zu verwenden. Mein Problem ist, dass wenn ich es mehrmals für die gleichen Papiere und Autoren ausfühle, es davon ausgeht, dass sie verschiedene Entitäten sind, und dann jeden Knoten und jede Beziehung in der Datenbank dupliziert (ich habe versucht, das Skript mehrere Male auszuführen). Aber das gleiche passiert nicht mit dem vorherigen Code. Dies ist der Code, der Transaktionen verwendet:

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() 

Antwort

1

Ich glaube, Sie die Merge-Funktion verwendet werden soll, und die Funktion nicht erstellen Duplikate zu vermeiden. Betrachten Sie den folgenden Quellcode:

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() 
Verwandte Themen