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

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

两种模式哪种更优?网上有太多的帖子讨论这个。可是,毕竟只有小孩子才做选择题,我们为什么不选择全都要呢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方法暴露成自定义函数在服务端模式调用,让你将二者结合应用的更得心应手。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 [email protected]

文章标题:neo4j同时使用嵌入模式和服务模式

文章字数:737

本文作者:刘雨

发布时间:2019-12-27, 18:27:14

最后更新:2019-12-27, 18:27:14

原始链接:http://blog.wowtools.org/2019/12/27/2019-12-27-custom-neo4j1/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏