我使用了 OpenKG 中的四大名著知识图谱数据:http://openkg.cn/dataset/ch4masterpieces
我们取一个熟悉的“西游记”来演示下,首先下载的数据解压到 ~/Downloads/data,里面有 CSV 和 OWL 文件。
我们打开 CSV 看下格式:
列 head 和 tail 都是人物名称,relation 和 label 即为关系
导入数据有几种方式:
- Cypher create 语句,为每一条数据写一个create
- Cypher load csv语句
- 官方提供的 neo4j-import 工具,未来将被 neo4j-admin import 代替
- 官方提供的Java API - BatchInserter
- 大牛编写的 batch-import 工具
- neo4j-apoc load.csv + apoc.load.relationship
我们这里就演示下 load csv 导入,其它大家自行了解。
因为我们是 Docker 启动的 Neo4j,Load csv 导入取的默认目录为 /var/lib/neo4j/import
,所以我们需要映射一下容器内这个文件夹,因为 csv 是在 Download 文件夹下,所以之前的启动 shell 脚本需要加上
-v ~/Downloads:/var/lib/neo4j/import
改动后如下:
#!/bin/bash
IMAGE=neo4j:4.1.4
CONTAINER=neo4j
PORT=7474
PORT_2=7687
echo "1st step: Removing existing $CONTAINER container..."
docker rm -f $CONTAINER || true
echo "2nd step: Deploying new docker instance of $IMAGE..."
docker run --name $CONTAINER \
-v ~/data/neo4j/data:/data \
-v ~/data/neo4j/logs:/logs \
-v ~/data/neo4j/conf:/conf \
-v ~/Downloads:/var/lib/neo4j/import \
-p $PORT:7474 \
-p $PORT_2:7687 \
-e NEO4J_AUTH=neo4j/123456 \
-d $IMAGE
重新启动Neo4j后,依次输入运行 Cypher 语句:
// 创建人物
LOAD CSV WITH HEADERS FROM "file:///data/西游记/triples.csv" AS line
MERGE (p:person{name:line.head});
LOAD CSV WITH HEADERS FROM "file:///data/西游记/triples.csv" AS line
MERGE (p:person{name:line.tail});
// 创建关系
LOAD CSV WITH HEADERS FROM "file:///data/西游记/triples.csv" AS line
match (from:person{name:line.tail}),(to:person{name:line.head})
merge (from)-[r:rel{label:line.label,relation:line.relation}]->(to)
然后测试一下一下语句:
// 查询所有为person的节点
MATCH (people:person) RETURN people
// 最多两个hops
MATCH (bacon:person {name:"孙悟空"})-[*1..2]-(hollywood)
RETURN DISTINCT hollywood
// 孙悟空和观音菩萨最短路径
MATCH p=shortestPath(
(bacon:person {name:"孙悟空"})-[*]-(meg:person {name:"观音菩萨"})
)
RETURN p
894 2023-02-19 18:05
到此一游