Neo4j 初体验
最近项目中新功能中需要用到知识图谱的功能。
通过简单的了解,知识图谱其数据的主要形式,是以数据、关系存储。
这样比较符合 NOSQL 的,推荐使用的是图数据库 Neo4j 。
折腾了几天下来,安装了环境,并实现基本的代码连接、操作功能。
一、安装
Neo4j 的安装还是挺方便快捷的,也比较简单。
Windows 安装
1、下载
直接在官网下载,根据自己需求下载对应版本。
a、下载压缩包文件
b、解译到对应目录
2、启动服务
1、Install service bin\neo4j install-service 2、Update service bin\neo4j update-service 3、Start service bin\neo4j start 4、查看状态 bin\neo4j status 5、Restart service bin\neo4j restart
Linux 安装
Linux 的安装基本同 Windows 的安装,一样下载、解压、启动服务。
在下载时会跳转到对应的安装帮助页面,在这里也有具体的操作指示。
配置修改
在安装目录下找到conf目录下的neo4j.conf文件,修改相应配置如下:
# 修改第22行load csv时l路径,在前面加个#,可从任意路径读取文件 #dbms.directories.import=import
# 修改54行,去掉改行的#,可以远程通过ip访问neo4j数据库 dbms.connectors.default_listen_address=0.0.0.0
# 默认 bolt端口是7687,http端口是7474,https关口是7473,不修改下面3项也可以 # 修改71行,去掉#,设置http端口为7687,端口可以自定义,只要不和其他端口冲突就行 dbms.connector.bolt.listen_address=:7687 # 修改75行,去掉#,设置http端口为7474,端口可以自定义,只要不和其他端口冲突就行 dbms.connector.http.listen_address=:7474 # 修改79行,去掉#,设置http端口为7473,端口可以自定义,只要不和其他端口冲突就行 dbms.connector.https.listen_address=:7473
# 修改245行,去掉#,允许从远程url来load csv dbms.security.allow_csv_import_from_file_urls=true
# 修改265行,设置neo4j可读可写 dbms.read_only=false
上面的行数只供参考,版本不一样行数不一样
二、3.x 和 4.x 区别
1、JDK 版本差异
3.x 使用的的 JDK 8(1.8)
4.x 使用的是 JDK11
所以在安装前查看已有环境的 JDK,再选择合适的版本。
2、库差异
3.x 版本只支持一个库
4.x 版本可以是多库的
三、.NET 连接操作
.NET 开发官方有对应的驱动库使用。
在 NuGet 上面搜索:Neo4j.Driver
在项目中引入即可,基本的使用如下:
[Route("[controller]")] [ApiController] public class Neo4jTestController : ControllerBase { private readonly IDriver driver; private readonly string url = "bolt://localhost:7687"; private readonly string userName = "neo4j"; private readonly string password = "neo4j"; public Neo4jTestController() { driver = GraphDatabase.Driver(url,AuthTokens.Basic( userName, password)); } // GET: api/<Neo4jTestController> [HttpGet] async public IAsyncEnumerable<string> Get() { List<string> result = new List<string>(); using (IAsyncSession session = Neo4jDriverLifecycle.Driver.AsyncSession(o => o.WithDatabase("neo4j"))) { IResultCursor cursor = await session.RunAsync("MATCH (a:Person) RETURN a.name as name"); result = await cursor.ToListAsync(record => record["name"].As<string>()); } yield return string.Join(",", result); } }
Neo4j.Driver 是可以向下兼容的,不过有一点需要注意。
注意:数据库使用
3.x 只有一个数据库,所以在使用时有一句代码需要修改:
IAsyncSession session = Neo4jDriverLifecycle.Driver.AsyncSession()
把 WithDatabase 去掉,否则会报错:
Neo4j.Driver.ClientException: Driver is connected to a server that does not support multiple databases.
参考:
Neo4j.Driver API(不是最新,更新到4.2)