背景

关系型数据库的数据要导入 Neo4j ,找了找网上的插件,写的不是很灵活。

无奈,只能直接写逻辑,将数据读出来然后写成 RDF 的格式。

最终借助 neosemantics 导入到 Neo4j 图数据库。实现将关系型数据库数据导入到图数据库。

以下是主要的逻辑。使用 Python 代码实现的。

原始数据为:

age id name school

0 20 4 张三 北大

1 21 6 李四 清华

2 20 5 王五 南大

代码如下:

import pandas as pd

# 数据库数据转化为RDF文件。使用 neosemantics 导入到Neo4j图数据库

data = {'id': [4, 6, 5], 'name': ['张三', '李四', '王五'], 'age': [20, 21, 20], 'school': ['北大', '清华', '南大']}

df = pd.DataFrame(data)

print(df)

table_name = 'person'

src_path = "C:\\Users\\my\\Desktop\\"

input_file = "xxx.rdf"

print(df.index.values.tolist())

print(df.columns.values.tolist())

def arr_to_rdf():

with open("%s\%s" % (src_path, input_file), 'w', encoding='utf-8') as file:

# 表名标签

file.write(f"@prefix {table_name}: .")

file.write('\r')

# 关系标签

file.write("@prefix relation: .")

file.write('\r')

for i in range(df.shape[1]):

column_name = df.columns.values.tolist()[i]

file.write(f"@prefix {column_name}: .")

file.write('\r')

for i in range(df.shape[0]):

# file.write("%s:%s" % (df.columns[i], df.iloc[i].at['id']))

for j in range(df.shape[1]):

file.write("%s:%s" % (df.columns.values.tolist()[j], df.iloc[i, j]))

file.write('\r')

file.write("relation:name '%s'; a relation:%s ." % (df.iloc[i, j], df.columns.values.tolist()[j]))

file.write('\r')

file.write("%s:%s" % (table_name, df.iloc[i].at['name']))

file.write('\r')

file.write("relation:name '%s';" % df.iloc[i].at['name'])

file.write('\r')

file.write("relation:%s %s:%s ." % (

df.columns.values.tolist()[j], df.columns.values.tolist()[j], df.iloc[i, j]))

file.write('\r')

if __name__ == '__main__':

arr_to_rdf()

形成的文件内容如下:

生成的文件格式其实是 ttl 格式的

@prefix person: .

@prefix relation: .

@prefix age: .

@prefix id: .

@prefix name: .

@prefix school: .

age:20

relation:name '20'; a relation:age .

person:张三

relation:name '张三';

relation:age age:20 .

id:4

relation:name '4'; a relation:id .

person:张三

relation:name '张三';

relation:id id:4 .

name:张三

relation:name '张三'; a relation:name .

person:张三

relation:name '张三';

relation:name name:张三 .

school:北大

relation:name '北大'; a relation:school .

person:张三

relation:name '张三';

relation:school school:北大 .

age:21

relation:name '21'; a relation:age .

person:李四

relation:name '李四';

relation:age age:21 .

id:6

relation:name '6'; a relation:id .

person:李四

relation:name '李四';

relation:id id:6 .

name:李四

relation:name '李四'; a relation:name .

person:李四

relation:name '李四';

relation:name name:李四 .

school:清华

relation:name '清华'; a relation:school .

person:李四

relation:name '李四';

relation:school school:清华 .

age:20

relation:name '20'; a relation:age .

person:王五

relation:name '王五';

relation:age age:20 .

id:5

relation:name '5'; a relation:id .

person:王五

relation:name '王五';

relation:id id:5 .

name:王五

relation:name '王五'; a relation:name .

person:王五

relation:name '王五';

relation:name name:王五 .

school:南大

relation:name '南大'; a relation:school .

person:王五

relation:name '王五';

relation:school school:南大 .

注意事项:

name 标签的值必须是字符串

namespace 在使用前,必须先定义

导入Neo4j:

CALL n10s.rdf.import.fetch('file:///C:/Users/my/Desktop/xxx.rdf', 'Turtle')

相关内容:

Neo4j导入RDF文件之neosemantics安装

文章链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: