实施步骤
1. 修改 Docker-compose 配置文件
增加 import 文件夹的映射:
version: "3"services:neo4j:image: neo4j:3.5.22-communitycontainer_name: neo4jprivileged: truerestart: alwaysenvironment:- NEO4J_AUTH=neo4j/neo4j123ports:- "7474:7474"- "7687:7687"volumes:- "./data:/var/lib/neo4j/data"- "./logs:/var/lib/neo4j/logs"- "./csv:/var/lib/neo4j/import"
重启 docker-compose
2. 上传 csv 文件
CSV 文件可以通过 Navitcat 或者 IDEA 之类的工具生成,参考SQL:
# 查询交易数据 value > 0
select `from`, `to`, hash, block_number
from t_eth_transaction12
where value > 0
order by block_number desc
limit 10000;
# 从地址表查询1w个地址 未去重
select `from`
from t_eth_transaction12
where value > 0
order by block_number desc
limit 10000;

备注:地址文件为单列数据,不含表头;交易数据有表头,如图所示:
3. 创建地址唯一索引
目的是保证每个 Address 节点的 address 属性是唯一的。
create constraint on (a:Address) assert a.address is unique
4. 导入地址节点
使用 merge 创建节点,使用 create 会导致唯一索引报错;
后续可以考虑建立 MySQL 地址表,并保证唯一性。
load csv from 'file:///address.csv' as row
merge(a:Address{address:row[0]})
on create set a.address = row[0]
5. 导入交易关系
匹配 Graph 中已有的地址节点数据,并建立交易关系,目前只设置了一种 TRANSFER_TO (即 A 转账给 B) 关系
load csv with headers from 'file:///tx.csv' as row
match (f:Address{address:row.from}),(t:Address{address:row.to})
create (f)-[r:TRANSFER_TO]->(t)
set r.hash = row.hash,r.bn = row.block_number,r.value = row.value
需要注意的是:务必保证这些交易关系中的地址已经保存到 Graph 的 Node 中,否则无法建立关系会导致数据丢失,可以通过查看导入成功的数量判断是否有数据丢失。
:::warning 这里存在一个需要解决的问题:如何以数字类型保存交易的金额,目前是字符串的类型,可能会影响查询。 :::
6. 查询测试
6.1 随机节点和关系查询
match (a:Address)-[*]->(t:Address) return a,t limit 100

6.2 查询地址:0xfe65829e78bbdb6392429e68cad0ff74a50354a2 三跳转出关系:
MATCH (a:Address{address:'0xfe65829e78bbdb6392429e68cad0ff74a50354a2'})-[*0..3]->(t)
RETURN a,t
参考资料
- 官方文档:https://neo4j.com/developer/guide-import-csv/
- Neo4j Desktop 远程连接 Neo4j:
