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、编写初始化代码
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; ... 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"; 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) { configOverrides.put(cfgKey, p.getProperty(cfgKey)); } serverBootstrapper.start(storeDir, cfgFile, configOverrides); NeoServer neoServer = serverBootstrapper.getServer(); 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方法暴露成自定义函数在服务端模式调用,让你将二者结合应用的更得心应手。