背景
关系型数据库的数据要导入 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}: <http://example.org/{table_name}#> .")
file.write('\r')
# 关系标签
file.write("@prefix relation: <http://example.org/relation#> .")
file.write('\r')
for i in range(df.shape[1]):
column_name = df.columns.values.tolist()[i]
file.write(f"@prefix {column_name}: <http://example.org/{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: <http://example.org/person#> .
@prefix relation: <http://example.org/relation#> .
@prefix age: <http://example.org/age#> .
@prefix id: <http://example.org/id#> .
@prefix name: <http://example.org/name#> .
@prefix school: <http://example.org/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')