原文链接
http://blog.wowtools.org/2019/12/27/2019-12-27-custom-neo4j1/
---
layout: post
title: "neo4j同时使用嵌入模式和服务模式"
categories: neo4j java
tags: neo4j扩展开发
author: 刘雨
---
neo4j(社区版)有两种模式:嵌入模式和服务器模式,下图描述了它们的使用区别,简单来说,嵌入模式就是直接用java代码去操作,服务器模式就是通过暴露出来的web端口传入查询语句等进行操作。
![嵌入模式与服务器模式对比](/myimgs/20191227/1.jpg)
两种模式哪种更优?网上有太多的帖子讨论这个。可是,毕竟只有小孩子才做选择题,我们为什么不选择全都要呢O(∩_∩)O
话不多说,直接上代码
1、引入maven依赖:
```
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j</artifactId>
<version>3.4.9</version>
</dependency>
<dependency>
<groupId>org.neo4j.app</groupId>
<artifactId>neo4j-server</artifactId>
<version>3.4.9</version>
</dependency>
```
2、拷贝一个neo4j.conf文件,按官方文档进行自己需要的配置,值得注意的是此处:
```
#数据文件存放位置
dbms.directories.data=D:/data/test
```
3、编写初始化代码
```
private static final ServerBootstrapper serverBootstrapper;
private static final String dbPath;
private static final GraphDatabaseService graphDb;
...
//读neo4j.conf的配置
Properties p = new Properties();
try {
p.load(ResourcesReader.readStream(Neo4jDbManager.class, "neo4j.conf"));
} catch (IOException e) {
throw new RuntimeException(e);
}
dbPath = p.getProperty("dbms.directories.data");
File storeDir = new File(dbPath);
serverBootstrapper = new CommunityBootstrapper();
String cfgFilePath = ResourcesReader.getClassRootPath(Neo4jDbManager.class) +
"/neo4j.conf";
//社区版的bug,部分属性无法直接从配置文件写入(例如7474端口号),手动覆盖一下
Optional<File> cfgFile = Optional.of(new File(cfgFilePath));
Set<String> cfgKeys = p.stringPropertyNames();
Map<String, String> configOverrides = new HashMap<>(cfgKeys.size());
for (String cfgKey : cfgKeys) {//把所有配置都读到map里,解决默认端口无法修改的问题
configOverrides.put(cfgKey, p.getProperty(cfgKey));
}
//启动服务端模式
serverBootstrapper.start(storeDir, cfgFile, configOverrides);
NeoServer neoServer = serverBootstrapper.getServer();
//获取内嵌模式db对象
graphDb = neoServer.getDatabase().getGraph();
```
其中,ResourcesReader是我自己写的一个工具类,负责从相对路径读取配置文件,要用的话需要引入这个maven,你也可以自己写一个来替换它~
```
<dependency>
<groupId>org.wowtools</groupId>
<artifactId>catframe-common</artifactId>
<version>1.4.2</version>
</dependency>
```
4、使用服务端模式和内嵌模式
当初始化完成后,服务模式已经在neo4j.conf配置的端口启动了,你可以在localhost:7474(默认端口是这个)这个可视化界面打开看到。
至于内嵌模式,因为前面我们已经拿到db对象了,可以任意利用java api去操作了,比如:
```
Transaction tx = graphDb.beginTx();//记得起事务和关闭事务
try {
graphDb.findNodes(Label.label("xxx"),"name","小明").forEachRemaining((node)->{
System.out.println(node.getProperty("age"));
});
} finally {
tx.close();
}
```
好了,同时享受内嵌模式的高性能和服务端模式的快捷吧~
下一节我们将介绍如何把java方法暴露成自定义函数在服务端模式调用,让你将二者结合应用的更得心应手。