目录

我使用了 OpenKG 中的四大名著知识图谱数据:http://openkg.cn/dataset/ch4masterpieces

我们取一个熟悉的“西游记”来演示下,首先下载的数据解压到 ~/Downloads/data,里面有 CSV 和 OWL 文件。

我们打开 CSV 看下格式:

Neo4j导入CSV文件数据

列 head 和 tail 都是人物名称,relation 和 label 即为关系

导入数据有几种方式:

  1. Cypher create 语句,为每一条数据写一个create
  2. Cypher load csv语句
  3. 官方提供的 neo4j-import 工具,未来将被 neo4j-admin import 代替
  4. 官方提供的Java API - BatchInserter
  5. 大牛编写的 batch-import 工具
  6. 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

Neo4j导入CSV文件数据