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

原文链接

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依赖:
```
       
            org.neo4j
            neo4j
            3.4.9
       

       
            org.neo4j.app
            neo4j-server
            3.4.9
       

```

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 cfgFile = Optional.of(new File(cfgFilePath));
        Set  cfgKeys = p.stringPropertyNames();
        Map 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,你也可以自己写一个来替换它~
```
       
            org.wowtools
            catframe-common
            1.4.2
       

```

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方法暴露成自定义函数在服务端模式调用,让你将二者结合应用的更得心应手。

你可能感兴趣的:(分享)