使用Py2neo

时间:2016-06-30 10:53:43

标签: python xml neo4j xml-parsing py2neo

我在使用36196662行导入一个非常大的XML文件时遇到问题。我正在尝试使用 Py2neo 我的xml文件创建此XML文件的 Neo4j图形数据库

http://imgur.com/pLylHeG

和我将用于将xml数据导入Neo4j的python代码就是这样:

from xml.dom import minidom
from py2neo import Graph, Node, Relationship, authenticate
from py2neo.packages.httpstream import http
http.socket_timeout = 9999
import codecs

authenticate("localhost:7474", "neo4j", "******")

graph = Graph("http://localhost:7474/db/data/")

xml_file = codecs.open("User_profilesL2T1.xml","r", encoding="latin-1")

xml_doc = minidom.parseString (codecs.encode (xml_file.read(), "utf-8"))

#xml_doc = minidom.parse(xml_file)
persons = xml_doc.getElementsByTagName('user')
label1 = "USER"

# Adding Nodes
for person in persons:


    if person.getElementsByTagName("id")[0].firstChild:
       Id_User=person.getElementsByTagName("id")[0].firstChild.data
    else: 
       Name="NO ID"
    print ("******************************USER***************************************")
    print(Id_User)



    print ("*************************")
    if person.getElementsByTagName("name")[0].firstChild:
       Name=person.getElementsByTagName("name")[0].firstChild.data
    else: 
       Name="NO NAME"   
   # print("Name :",Name)


    print ("*************************")
    if person.getElementsByTagName("screen_name")[0].firstChild:
       Screen_name=person.getElementsByTagName("screen_name")[0].firstChild.data
    else: 
       Screen_name="NO SCREEN_NAME" 
  #   print("Screen Name :",Screen_name)

    print ("*************************") 
    if person.getElementsByTagName("location")[0].firstChild:
       Location=person.getElementsByTagName("location")[0].firstChild.data
    else: 
       Location="NO Location"   
 #    print("Location :",Location)


    print ("*************************")
    if person.getElementsByTagName("description")[0].firstChild:
       Description=person.getElementsByTagName("description")[0].firstChild.data
    else: 
       Description="NO description" 
  #   print("Description :",Description)


    print ("*************************") 
    if person.getElementsByTagName("profile_image_url")[0].firstChild:
       Profile_image_url=person.getElementsByTagName("profile_image_url")[0].firstChild.data
    else: 
       Profile_image_url="NO profile_image_url" 
   # print("Profile_image_url :",Profile_image_url)

    print ("*************************")
    if person.getElementsByTagName("friends_count")[0].firstChild:
       Friends_count=person.getElementsByTagName("friends_count")[0].firstChild.data
    else: 
       Friends_count="NO friends_count" 
 #    print("Friends_count :",Friends_count)


    print ("*************************")
    if person.getElementsByTagName("url")[0].firstChild:
       URL=person.getElementsByTagName("url")[0].firstChild.data
    else: 
       URL="NO URL" 
  #   print("URL :",URL)






    node1 = Node(label1,ID_USER=Id_User,NAME=Name,SCREEN_NAME=Screen_name,LOCATION=Location,DESCRIPTION=Description,Profile_Image_Url=Profile_image_url,Friends_Count=Friends_count,URL=URL)
    graph.merge(node1)  

我的问题是当我运行代码时,需要花费很长时间才能导入这个文件差不多一周才能做到这一点,所以如果能有人帮助我更快地导入数据,我会非常感激。

注意:我的笔记本电脑配置为:4Gb RAM,500Gb硬盘,i5

2 个答案:

答案 0 :(得分:2)

我认为你应该使用一个流解析器,否则它甚至可能在python一侧溢出内存。

另外,我建议在Neo4j中进行交易,每笔交易批量更新10k到100k。

不要存储"NO xxxx"字段,只是将它们留下来只是浪费空间和精力。

我不知道merge(node)是如何工作的。我建议在:User(userId)上创建一个唯一约束,并使用如下的密码查询:

UNWIND {data} as row
MERGE (u:User {userId: row.userId}) ON CREATE SET u += {row}

其中{data}参数是具有属性的字典列表(例如10k条目)。

答案 1 :(得分:1)

如果要将数据导入新数据库,可能需要尝试使用导入工具:https://neo4j.com/docs/operations-manual/current/#import-tool

在这种情况下,您应该像现在一样解析XML文件,而不是使用py2neo将数据插入Neo4j,只需编写一个CSV文件,然后再调用导入工具。

请参阅下面的可能方法:

$ neo4j-import --into neo4j-community-3.0.3/data/databases/users.db --nodes:User users.csv

将xml转换为csv文件后,运行import-tool:

{{1}}

我猜你也想在节点之间建立关系(?)。您应该阅读导入工具文档,并使用csv文件为节点和关系调用import-tool