• Py2neo:一种快速导入百万数据到Neo4j的方式


    Py2neo:一种快速导入百万数据到Neo4j的方式

    Py2neo是一个可以和Neo4j图数据库进行交互的python包。虽然py2neo操作简单方便,但是当节点和关系达几十上百万时,直接创建和导入节点、关系的方式会越来越耗时。本文提供一个py2neo小技巧,通过简单的代码,能够以每秒1万节点/关系的速度快速将数据导入Neo4j。



    1、Neo4j与Py2neo

    对于已构建知识图谱,通过可视化技术能够清晰、直观的呈现实体与实体之间的关系。Neo4j图数据库作为高性能和轻量级的知识存储与可视化工具,在实践中的应用越来越广泛。
    Py2neo为python代码操作Neo4j提供了便利,简单好用,具体可访问其操作手册。
    Neo4j官网
    Py2neo手册

    2、Py2neo常规导入节点/关系到Neo4j的方法

    Py2neo导入知识图谱到Neo4j的一般方式是,利用Node和Relationship分别实例化节点和关系,然后利用Graph的create()方法创建相应的节点和关系,具体示例如下:

    
    from py2neo import Graph, Node, Relationship
    
    
    if __name__ == '__main__':
        # 连接neo4j
        graph = Graph("http://localhost:7474", auth=("neo4j", "123456"))
    
        # 创建两个节点
        node_1 = Node("py2neo", name="py2neo")
        graph.create(node_1)
        node_2 = Node("neo4j", name="neo4j")
        graph.create(node_2)
    
        # 创建两个节点之间的关系
        relation = Relationship(node_1, "Subgraph()导入节点/关系就是快", node_2)
        graph.create(relation)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    示例

    3、Py2neo快速导入节点/关系到Neo4j的方法

    第2节中的方法对于少量数据速度尚可,但是不适合大数据量的情形。为此,可利用py2neo的Subgraph类构造子图,并在Transaction中批量创建节点和关系。此处详细文档可参考:详细文档
    Py2neo批量创建节点/关系示例如下:

    
    from py2neo import Graph, Subgraph, Node, Relationship
    
    
    def batch_create(graph, nodes_list, relations_list):
        """
            批量创建节点/关系,nodes_list和relations_list不同时为空即可
            特别的:当利用关系创建节点时,可使得nodes_list=[]
        :param graph: Graph()
        :param nodes_list: Node()集合
        :param relations_list: Relationship集合
        :return:
        """
    
        subgraph = Subgraph(nodes_list, relations_list)
        tx_ = graph.begin()
        tx_.create(subgraph)
        graph.commit(tx_)
    
    
    if __name__ == '__main__':
        # 连接neo4j
        graph = Graph("http://localhost:7474", auth=("neo4j", "123456"))
    
        # 批量创建节点
        nodes_list = []  # 一批节点数据
        relations_list = []  # 一批关系数据
        # 如:实例化一个节点
        node_1 = Node("中药名", name="白术")
        nodes_list.append(node_1)
        node_2 = Node("功能", name="健脾")
        nodes_list.append(node_2)
    
        # 创建两个节点之间的关系
        relation = Relationship(node_1, "功能", node_2)
        relations_list.append(relation)
    
        node_3 = Node("功能", name="益气")
        nodes_list.append(node_3)
        relation2 = Relationship(node_1, "功能", node_3)
        relations_list.append(relation2)
    
        # 批量创建节点/关系
        batch_create(graph, nodes_list, relations_list)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    示例图

    (哈哈哈:图与功能不匹)
    该方法能够以每秒至少1万节点/关系的速度快速将数据导入Neo4j(其实可以更快速)。

    4、Neo4j快速清库大量数据的方法

    match (n) detach delete n
    
    • 1

    对于少量数据,在neo4j中可以利用上面一行命令删除,但是当节点和关系非常多的时候,该方法很耗时。经过实验,提供如下方法:即:在neo4j安装目录中分别找到data和transactions目录,然后在两个目录中分别删掉需要删除数据库名字的文件夹即可(特别的:删库需谨慎)。

    总结

    本文记录了一个py2neo快速导入知识图谱到neo4j的方法。

     


    欢迎关注公众号:实用自然语言处理

    欢迎关注公众号:实用自然语言处理
     
    原文首发于微信公众号:实用自然语言处理

  • 相关阅读:
    智能交通收费RFID读写器在不停车收费(ETC)系统中的应用
    SOCKS55代理与Http代理有何区别?如何选择?
    Centos7 |Canal Admin搭建Canal Server集群|
    字典组件(前端使用)
    QT中进程的创建
    借助模糊逻辑将文化算法与和谐搜索相结合进行学习(Matlab代码实现)
    二叉树顺序存储结构
    OS - 操作系统实战 - 学习/实践
    c语言 --- 运算符和表达式
    Spring事务实现的方式及底层原理
  • 原文地址:https://blog.csdn.net/qiang12qiang12/article/details/127692314