2016-05-04 2 views
1

Im пытается загрузить данные в Neo4j БД из XML-файла с помощью py2neoЗагрузка данных Neo4j из XML с помощью py2neo

этот питон скрипт отлично работает, но его слишком медленно, поскольку Im добавляя узлы первого, то отношения с двумя исключениями обработчиков , кроме того, размер файла XML составляет около 200 МБ.

Мне интересно, есть ли более быстрый способ выполнить эту задачу?

XML файл:

<Persons> 
    <person> 
     <id>XA123</id> 
     <first_name>Adam</first_name> 
     <last_name>John</last_name> 
     <phone>01-12322222</phone> 
    </person> 
    <person> 
     <id>XA7777</id> 
     <first_name>Anna</first_name> 
     <last_name>Watson</last_name> 
     <relationship> 
      <type>Friends</type> 
      <to>XA123</to> 
     </relationship> 
    </person> 
</Persons> 

питон скрипт:

#!/usr/bin/python3 

from xml.dom import minidom 
from py2neo import Graph, Node, Relationship, authenticate 


graph = Graph("http://localhost:7474/db/data/") 
authenticate("localhost:7474", "neo4j", "admin") 

xml_file = open("data.xml") 
xml_doc = minidom.parse(xml_file) 
persons = xml_doc.getElementsByTagName('person') 

# Adding Nodes 
for person in persons: 
    ID_ = person.getElementsByTagName('id')[0].firstChild.data 
    fName = person.getElementsByTagName('first_name')[0].firstChild.data 
    lName = person.getElementsByTagName('last_name')[0].firstChild.data 

    # not every person has phone number 
    try: 
     phone = person.getElementsByTagName('phone')[0].firstChild.data 
    except IndexError: 
     phone = "None" 

    label = "Person" 
    node = Node(label, ID=ID_, LastName=fName, FirstName=lName, Phone=phone) 
    graph.create(node) 


# Adding Relationships 
for person in persons: 
    ID_ = person.getElementsByTagName('id')[0].firstChild.data 

    label = "Person" 
    node1 = graph.find_one(label, property_key="ID", property_value=ID_) 

    # relationships 
    try: 
     has_relations = person.getElementsByTagName('relationship') 
     for relation in has_relations: 
      node2 = graph.find_one(label, 
            property_key="ID", 
            property_value=relation.getElementsByTagName('to')[0].firstChild.data) 

      relationship = Relationship(node1, 
             relation.getElementsByTagName('type')[0].firstChild.data, node2) 
      graph.create(relationship) 
    except IndexError: 
     continue 

ответ

1

время, необходимое для загрузки данных в Neo4j значительно снижается за счет использования уникальных ограничений свойств для конкретной этикетке.

graph.cypher.execute("CREATE CONSTRAINT ON (n:Person) ASSERT n.ID IS UNIQUE") 
Смежные вопросы