TiffanyBlews's Blog

我们所经历的每个平凡的日常,也许就是连续发生的奇迹。

图数据库neo4j入门避坑记录

neo4j安装

安装请尽量按照目标版本的官方文档的流程,使用包管理器安装。

安装时遇到:

错误: 找不到或无法加载主类 org.neo4j.server.startup.Neo4jCommand

Error: Could not find or load main class org.neo4j.server.startup.Neo4jCommand
Caused by: java.lang.ClassNotFoundException: org.neo4j.server.startup.Neo4jCommand

此错误是由于JDK版本与neo4j对不上,一个大坑是部分neo4j版本并不能向下兼容JDK!例如neo4j 4.4版本只支持JDK11!!!我排查了半天捣鼓了半天环境变量,发现是我装的是14,版本过高……

neo4j 4 导入neo4j数据库目录文件夹

网上和教程找到的导入方法只有两种情况:

  • 导入.csv文件
  • 导入.dump数据库备份文件

但我下载的SpCQL提供的数据库直接是neo4j\data\databases中的数据库目录文件夹。我导入的过程如下:

  1. 将文件夹复制到neo4j\data\databases目录下
  2. neo4j\conf\neo4j.conf中修改dbms.default_database值为文件夹的名称(即数据库的名称)——由于我用的是社区版,只支持同时打开一个数据库,这一步会让初始数据库(名称为neo4j)状态变为不可用。如果是企业版可能这一步可以省略,直接切换数据库就好了?
  3. 此时启动neo4j,查询到新数据库的状态为offline,用命令查询会报错An error occurred! Unable to start DatabaseId{xxxxxx}。并且发现控制台报错

    Neo4j cannot be started because the database files require upgrading and upgrades are disabled in the configuration. Please set 'dbms.allow_upgrade' to 'true' in your configuration file

    照提示做,将dbms.allow_upgrade设为true后重启,等待片刻更新数据库即可正常使用

把数据库升级到neo4j 5

下载的SpCQL数据库版本号是v0.A.9,是neo4j 3.4.0的数据库(版本号对应关系在这里),上面的方法是导入neo4j 4的。但服务器上的neo4j版本为5。

neo4j 5取消了dbms.allow_upgrade,只能使用neo4j-admin database migrate命令移植旧数据库

但测试发现5的migrate并不支持v0.A.9

2024-04-26 08:24:23.052+0000 ERROR [o.n.c.d.MigrateStoreCommand] Failed to migrate database 'graph-all02.db': Unable to read store with version 'v0.A.9'. Please make sure that database is migrated properly to be supported by current version of neo4j.
2024-04-26 08:24:23.052+0000 ERROR [o.n.c.d.MigrateStoreCommand] Migration failed for databases: 'graph-all02.db'
org.neo4j.cli.CommandFailedException: Migration failed for databases: 'graph-all02.db'
……

于是只能先按上面的方法在neo4j 4中载入,在neo4j.conf中写入dbms.allow_upgrade=true,启动neo4j,这时会自动将数据库转换为4的格式——这时已经可以用neo4j 4运行数据库了。

然后再把数据库目录/data/databases/xxx/上传到neo4j 5的对应目录,执行neo4j-admin database migrate,迁移完成后在neo4j.conf中切换初始数据库,才能成功运行。

使用neo4j

基础Cypher操作

https://zhuanlan.zhihu.com/p/88745411

安装apoc插件

  1. 将对应版本的apoc插件复制到neo4j\plugins
  2. 修改neo4j\conf\neo4j.conf配置文件,将dbms.security.procedures.unrestricted的值改为apoc.*,以允许访问所有数据
  3. neo4j\conf文件夹里新建apoc.conf,并写入apoc.export.file.enabled=true(或者使用环境变量也可以)

统计图数据库基本情况

查询元图

CALL apoc.meta.graph();

查询节点与关系总数

在数据量很大的情况下如果直接运行

MATCH (n), ()-[r]-()
RETURN count(n) AS TotalNodes, count(r) AS TotalRelationships

会爆内存,所以需要使用apoc插件查询,即

CALL apoc.meta.stats();

查看前1000个节点关系情况

MATCH (n)-[r]->()
RETURN n, r
SKIP 0 LIMIT 1000

查看前100个关系名称

MATCH ()-[r]->()
WHERE type(r) = "Relationship" AND r.properties.name IS NOT NULL
RETURN r.properties.name AS RelationshipPropertyName
SKIP 0 LIMIT 100