Advertisement

知识图谱构建之二:从结构化数据到知识图谱

阅读量:
在这里插入图片描述

请关注一下微信公众号:机器学习简明教程

若在关系型数据库中发现oracle、mysql或hive存储了一张与特定主题相关的表,则可以考虑如何构建基于该表的知识图谱。

我们来看一个简单的例子。

01 关系型表

在这里插入图片描述

该表格的结构信息可见于上图中,并包括公众号名称、创建时间、分享内容的方向以及共有四个字段用于记录相关信息

创建节点的方法共有两种。第一种方式建议将每个字段单独构建成一个节点,在这种情况下,“公众号名称”字段可被用作该节点的标签名,“对应的”具体数据则对应于name属性值;第二种方式则建议将“公众号名称”构建成一个独立的节点,并将其余数据整合到该特定类型的节点中以形成完整的数据库结构。

关系的创建本质上相当于将上面这张表列转换为水平排列。从核心内容来看, 关系的标签名称涉及三个关键维度: 建立时间、传播路径以及发布人。

详细工程代码和描述如下。

02 抽取

复制代码
    from py2neo import Node, Graph, Relationship
    import pandas as pd
    # connect neo4j
    graph = Graph("bolt://localhost:7687", username="neo4j", password="****")
    label_1 = "公众号节点"
    label_2 = "公众号信息节点"
    graph.delete_all()
    ​
    # step1:read data
    data = pd.read_csv("./data/raw_data.csv", header=0)
    data["建立于"] = data["建立于"].astype(str)
    ​
    # step2 : extract nodes
    node_list = list(set(data['公众号名']))
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

mac下执行命令pip install py2neo==3,安装指定版本的py2neo。

实例化Graph类,并通过该类连接neo4j。

第一类节点:抽取出“公众号名称”字段,去重后转成list。

复制代码
    # step3 : extract nodes
    node_info_list = []
    for i in list(data.columns)[1:]:
    node_info_list.extend(data[i])
    node_info_list = list(set(node_info_list))
    
    
      
      
      
      
      
    
    代码解读

第二类节点为:遍历除"公众号名称"外的所有字段值,并去重后存入node_info_list列表中。

复制代码
    # step4 : extract relationships
    relation_data = pd.DataFrame()
    for i in list(data.columns)[1:]:
    rel_data = data[["公众号名", i]]
    rel_data["关系"] = i
    rel_data.columns = ["公众号节点", "公众号信息节点", "关系"]
    relation_data = pd.concat([relation_data, rel_data], axis=0)
    
    
      
      
      
      
      
      
      
    
    代码解读

关系三元组:基于原始的data,列转行抽取关系。

03 写入

复制代码
    def create_node(node_list, label):
    for name in node_list:
        print(name)
        name_node = Node(label, name=name)
        print(name_node)
        graph.create(name_node)
    create_node(node_list, label_1)
    create_node(node_info_list, label_2)
    
    
      
      
      
      
      
      
      
      
    
    代码解读

创建节点:create_node遍历节点列表,创建标签为label的节点。

复制代码
    def create_relation(relation_data, label_a, label_b):
    for m in range(0, len(relation_data)):
        print()
        rel = Relationship(
            graph.find_one(label_a, property_key="name", property_value=str(list(relation_data['公众号节点'])[m])),
            list(relation_data['关系'])[m],
            graph.find_one(label_b, property_key="name", property_value=str(list(relation_data['公众号信息节点'])[m])))
        graph.merge(rel, label=[label_b, label_a])
     create_relation(relation_data, label_1, label_2)
    
    
      
      
      
      
      
      
      
      
      
    
    代码解读

创建关系:create_relation遍历关系数据并创建关系。

在这里插入图片描述

日志:节点和关系抽取过程如上。

在这里插入图片描述

知识图谱:最后neo4j中会出现如上图所示的节点与关系。

全部评论 (0)

还没有任何评论哟~