实施步骤

1. 修改 Docker-compose 配置文件

增加 import 文件夹的映射:

  1. version: "3"
  2. services:
  3. neo4j:
  4. image: neo4j:3.5.22-community
  5. container_name: neo4j
  6. privileged: true
  7. restart: always
  8. environment:
  9. - NEO4J_AUTH=neo4j/neo4j123
  10. ports:
  11. - "7474:7474"
  12. - "7687:7687"
  13. volumes:
  14. - "./data:/var/lib/neo4j/data"
  15. - "./logs:/var/lib/neo4j/logs"
  16. - "./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;

image.png
备注:地址文件为单列数据,不含表头;交易数据有表头,如图所示:
image.png

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 中,否则无法建立关系会导致数据丢失,可以通过查看导入成功的数量判断是否有数据丢失。
image.png

:::warning 这里存在一个需要解决的问题:如何以数字类型保存交易的金额,目前是字符串的类型,可能会影响查询。 :::

6. 查询测试

6.1 随机节点和关系查询

match (a:Address)-[*]->(t:Address) return a,t limit 100

image.png

6.2 查询地址:0xfe65829e78bbdb6392429e68cad0ff74a50354a2 三跳转出关系:

MATCH (a:Address{address:'0xfe65829e78bbdb6392429e68cad0ff74a50354a2'})-[*0..3]->(t) 
RETURN a,t

image.png

参考资料

  1. 官方文档:https://neo4j.com/developer/guide-import-csv/
  2. Neo4j Desktop 远程连接 Neo4j: