SDU创新实训1.1 [知识存储]python读取excel文件并存储到neo4j数据库

大体思路

对科研文献进行知识存储。数据结构如图
在这里插入图片描述
实体节点分为四类:

		self.Paper = '文章'
        self.Author = '作者'
        self.Organ = '来源单位'
        self.Keyword = '关键词'

关系分为三类:

self.lists={'Author':'作者','Organ':'来源单位','Keyword':'关键词'}

知识存储需要对数据进行处理,读取数据之间的关系并存入neo4j数据库
分为两个功能模块:
第一个模块创建实体节点和实体间的关系
第二个模块读取excel并提取节点数据和关系数据

具体实现

DataToNeo4jClass.py

创建节点:
def create_node(self, node_list_paper, node_list_author,node_list_organ,node_list_keyword):
    """建立节点"""
    #对文章,属性包括名字,作者,来源,关键词

    for line in node_list_paper:
        paper = Node(self.Paper, title=line[0],author=line[1],organ=line[2],keyword=line[3])
        self.graph.create(paper)
        #对作者
    for name in node_list_author:
        value_node = Node(self.Author, name=name)
        self.graph.create(value_node)
        #对机构
    for name2 in node_list_organ:

        value2_node = Node(self.Organ, name=name2)
        self.graph.create(value2_node)
        #对关键词
    for name3 in node_list_keyword:
        value3_node = Node(self.Keyword, name=name3)
        self.graph.create(value3_node)

对导入的节点列表获取列表数据,利用py2neo语句创建节点

创建关系
def create_relation(self, df_data):
    """建立联系"""
    #matcher = NodeMatcher(self.graph)
    m = 0
     # try:
        #     index=df_data['relation'][m]
        #     rel = Relationship(matcher.match(self.Paper, title=df_data['name'][m]),#起始node
        #                        index, #关系
        #                        matcher.match(self.lists[index],name=df_data['name2'][m]))
        #     self.graph.create(rel)
        # except AttributeError as e:
        #     print(e, m)
    for m in range(0, len(df_data)):
            index = df_data['relation'][m]
            query = "match(p:%s),(q:%s) where p.title='%s'and q.name='%s' create (p)-[rel:%s]->(q)" % (
                self.Paper, self.lists[index], df_data['name'][m], df_data['name2'][m], index)
            try:
                self.graph.run(query)

            except Exception as e:
                print(e)

df_data为字典结构,有三个键值,

 links_dict['name'] = name_list
    links_dict['relation'] = relation_list
    links_dict['name2'] = name2_list
    # 将数据转成DataFrame
    df_data = pd.DataFrame(links_dict)

build_graph.py

data_extraction():
"""节点数据抽取"""

# 取出excel各个数据取值到list
node_list_paper = []
node_list_author = []
node_list_organ = []
node_list_keyword = []
for i in range(0, len(invoice_data)):
    node_list_paper.append(invoice_data.iloc[i].tolist())

    #
    node_list_author1=[i for i in str(invoice_data['Author'][i]).split(';') if i !='']
    node_list_author.extend(node_list_author1)
    #x
    node_list_organ1=[i for i in str(invoice_data['Organ'][i]).split(';') if i !='']
    node_list_organ.extend(node_list_organ1)
    #
    node_list_keyword1 =[i for i in str(invoice_data['Keyword'][i]).split(';;') if i !='']
    node_list_keyword.extend(node_list_keyword1)

node_list_author= list(set(node_list_author))
node_list_organ= list(set(node_list_organ))
node_list_keyword= list(set(node_list_keyword))


return node_list_paper ,node_list_author, node_list_organ ,node_list_keyword

所有数据进行抽离,建立节点

relation_extraction():
"""联系数据抽取"""

links_dict = {}
name_list = []
relation_list = []
name2_list = []

for i in range(0, len(invoice_data)):
    m = 0
   #获取每一行的文章名
    name_node = invoice_data[invoice_data.columns[m]][i]
    while m < len(invoice_data.columns)-2:
        m += 1  ##最后namelist一直是首个列,name2list是剩下的列数据,relation保存列首元素和其他列数据的关

        # 获取当前节点所在列的下一列列名下的数据,作为指向节点
        list1= [i for i in str(invoice_data[invoice_data.columns[m]][i]).split(';') if i != '']
        for j in list1:
            # 获取当前节点所在列的下一列列名作为关系
            relation_list.append(invoice_data.columns[m])
            name2_list.append(j)
            name_list.append(name_node)

    # 对关键词单独分析
    m += 1
    list2 = [i for i in str(invoice_data[invoice_data.columns[m]][i]).split(';;') if i != '']
    for k in list2:
        # 获取当前节点所在列的下一列列名作为关系
        relation_list.append(invoice_data.columns[m])
        name2_list.append(k)
        name_list.append(name_node)


# 整合数据,将三个list整合成一个dict
links_dict['name'] = name_list
links_dict['relation'] = relation_list
links_dict['name2'] = name2_list
# 将数据转成DataFrame
df_data = pd.DataFrame(links_dict)
print(df_data['relation'])
return df_data

dfdata中 name通过relation关联到name2

实现效果

以关键词关系作为实例
在这里插入图片描述
中间蓝色节点为论文文献,四周灰色节点为关键词。拥有相同关键词论文会被关键词链接,每个论文通过自身关键词互连。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值