知识图谱:py2neo将csv文件导入neo4j

文章目录

安装py2neo

安装python中的neo4j操作库:pip install py2neo

安装py2neo后我们可以使用其中的函数对neo4j进行操作。

图数据库Neo4j中最重要的就是结点和边(关系),结点之间靠边联系在一起,每个结点也有属于自己的属性。

也就是说我们在用pyhton操作Neo4j的时候只需要创造出节点(Node )和节点之间的关系:边(Relationship ),如果节点存在附加属性,可以再给结点附上一些属性。

注意: 在我们用python的时候我们必须启动Neo4j。如图所示,点击connect进行连接。

创建节点-连线关系图

下面我们就创建三个结点,每个结点有两个属性,两结点之间有一个关系。

python 复制代码
from py2neo import Graph, Node, Relationship
# 连接neo4j数据库,输入地址、用户名、密码
graph = Graph("http://localhost:7474", name="neo4j", password='xxx')
graph.delete_all() #清除neo4j中原有的结点等所有信息

# 创建结点
node1 = Node('person', name = 'chenjianbo')   #该结点语义类型是person  结点名字是chenjianbo  也是它的属性
node2 = Node('major',name = 'software')       #该结点语义类型是major  结点名字是software  也是它的属性
node3 = Node('person',name = 'bobo')          #该结点语义类型是person  结点名字是bobo   也是它的属性


#给结点node1 添加一个属性 age
node1['age'] = 18
#给结点node2 添加一个属性 college
node2['college'] = 'software college'
#给结点node3 添加一个属性 sex
node3['sex'] = '男'

#把结点实例化 在Neo4j中显示出来
graph.create(node1)
graph.create(node2)
graph.create(node3)
# 创建关系
maojor = Relationship(node1, '专业', node2)
friends = Relationship(node1, '朋友', node3)
maojor1 = Relationship(node3, '专业', node2)
#把关系实例化 在Neo4j中显示出来
graph.create(maojor)
graph.create(maojor1)
graph.create(friends)
导入csv文件

该网站有大量汇总的知识图谱数据集,可供学习使用。
http://openkg.cn/dataset

周杰伦歌曲知识数据集csv,应用三元组的形式将歌曲歌手所属专辑联系在一起。

  • dataframe格式读入数据
python 复制代码
import pandas as pd

df = pd.read_csv('relation.csv',index_col=0)

df
python 复制代码
	Column1	Column2	Column3
id			
1	Dare for more	周杰伦	歌手
2	Dare for more	蔡依林	歌手
6	Mine Mine	惊叹号	所属专辑
7	Now You See Me	周杰伦	歌手
8	Now You See Me	方文山	作词
...	...	...	...
624	最后的战役	周杰伦	歌手
625	最后的战役	方文山	作词
626	最后的战役	八度空间	所属专辑
627	最长的电影	周杰伦	歌手
628	最长的电影	我很忙	所属专辑
  • 使用py2neoneo4j添加节点和边
python 复制代码
graph.delete_all() #清除neo4j中原有的结点等所有信息

for index,row in df.iterrows():
    node1 = Node('person',name=row[0])
    node2 = Node('person',name=row[1])
    
    graph.create(node1)
    graph.create(node2)
    
    each = Relationship(node1, row[2], node2)
    graph.create(each)

这样生成的知识图谱只是简单的节点-边的关系,存在大量冗余的实体entity

可以通过neo4j的删除方法将重复节点进行删除,之后将边重新连接。

删除重复节点并连接边

查询重复节点,如果有重复节点就不create。这样节点和边全部联系在一起,形成完整的没有冗余的知识图谱。

目前的缺点是节点Node的命名都是以person命名,所以节点暂时没有区分。

python 复制代码
graph.delete_all() #清除neo4j中原有的结点等所有信息
from py2neo import NodeMatcher
entity = []

for index,row in df.iterrows():
    if row[0] not in entity:
        entity.append(row[0])
        node1 = Node('person',name=row[0])
        graph.create(node1)
    else:
        node_matcher = NodeMatcher(graph) 
        node1 = list(node_matcher.match('person').where(name=row[0]))[0]
        print(node1)

    if row[1] not in entity:
        entity.append(row[1])  
        node2 = Node('person',name=row[1])
        graph.create(node2)
    else:
        node_matcher = NodeMatcher(graph) 
        node2 = list(node_matcher.match('person').where(name=row[1]))[0]
        print(node2)
        
    each = Relationship(node1, row[2], node2)
    graph.create(each)
相关推荐
阿坡RPA5 小时前
手搓MCP客户端&服务端:从零到实战极速了解MCP是什么?
人工智能·aigc
用户27784491049936 小时前
借助DeepSeek智能生成测试用例:从提示词到Excel表格的全流程实践
人工智能·python
机器之心6 小时前
刚刚,DeepSeek公布推理时Scaling新论文,R2要来了?
人工智能
数据智能老司机8 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
算AI8 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
JavaEdge在掘金8 小时前
ssl.SSLCertVerificationError报错解决方案
python
数据智能老司机8 小时前
CockroachDB权威指南——开始使用
数据库·分布式·架构
我不会编程5558 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
凯子坚持 c9 小时前
基于飞桨框架3.0本地DeepSeek-R1蒸馏版部署实战
人工智能·paddlepaddle
松果猿9 小时前
空间数据库学习(二)—— PostgreSQL数据库的备份转储和导入恢复
数据库