neo4j同时使用嵌入模式和服务模式

neo4j(社区版)有两种模式:嵌入模式和服务器模式,下图描述了它们的使用区别,简单来说,嵌入模式就是直接用java代码去操作,服务器模式就是通过暴露出来的web端口传入查询语句等进行操作。
嵌入模式与服务器模式对比

两种模式哪种更优?网上有太多的帖子讨论这个。可是,毕竟只有小孩子才做选择题,我们为什么不选择全都要呢O(∩_∩)O

话不多说,直接上代码

1、引入maven依赖:

1
2
3
4
5
6
7
8
9
10
<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文件,按官方文档进行自己需要的配置,值得注意的是此处:

1
2
#数据文件存放位置
dbms.directories.data=D:/data/test

3、编写初始化代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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,你也可以自己写一个来替换它~

1
2
3
4
5
<dependency>
<groupId>org.wowtools</groupId>
<artifactId>catframe-common</artifactId>
<version>1.4.2</version>
</dependency>

4、使用服务端模式和内嵌模式
当初始化完成后,服务模式已经在neo4j.conf配置的端口启动了,你可以在localhost:7474(默认端口是这个)这个可视化界面打开看到。

至于内嵌模式,因为前面我们已经拿到db对象了,可以任意利用java api去操作了,比如:

1
2
3
4
5
6
7
8
9
Transaction tx = graphDb.beginTx();//记得起事务和关闭事务
try {
graphDb.findNodes(Label.label("xxx"),"name","小明").forEachRemaining((node)->{
System.out.println(node.getProperty("age"));
});
} finally {
tx.close();

}

好了,同时享受内嵌模式的高性能和服务端模式的快捷吧~
下一节我们将介绍如何把java方法暴露成自定义函数在服务端模式调用,让你将二者结合应用的更得心应手。


本文采用 CC BY-SA 4.0 协议 ,转载请注明原始链接: https://blog.wowtools.org/2019/12/27/2019-12-27-custom-neo4j1/

×

请作者喝杯咖啡