Neo4j的Java嵌入式开发

Posted xuweiweiwoaini

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Neo4j的Java嵌入式开发相关的知识,希望对你有一定的参考价值。

Neo4j开发入门

Java嵌入式开发模式

  • Java开发人员完全可以直接在代码中调用Neo4j的API,并将对Neo4j数据库的操作嵌入在Java代码中。
  • 面向Java开发人员:

技术图片

各语言驱动开发模式

  • 其他开发语言如.NET、javascript、Python、php等也希望能够和Neo4j相互集成,就像操作传统的关系型数据库那样熟练的操作Neo4j这个图数据库。

  • Java Driver:面向Java开发人员。

  • .net Driver:面向.net开发人员。

  • JavaScript Driver:面向前端开发人员。

  • Python Driver:面向Python开发人员。

Neo4j HTTP API

  • 通过标准的HTTP协议(POST、GET、PUT、DELETE)操作Neo4j数据库。
  • 各语言驱动开发模式就是其它开发平台、语言通过它们专门基于HTTP的HTTP API的驱动包或驱动库就可以和Neo4j相互对话。

三种开发模式的结构

技术图片

Java API嵌入式开发

准备工作

各版本的依赖库及其名称

  • 由于Neo4j分为社区版和企业版。首先需要确定对应的版本和名称,下面概述了用于依赖管理工具的可用版本及其名称。
版本 依赖库 描述
Neo4j社区版 org.neo4j:neo4j 社区版,有完全的ACID事务
Neo4j企业版 org.neo4j:neo4j-enterprise 企业版,添加高级监控,在线备份和高可用功能集群

导入Neo4j的jar包的Maven坐标

  • pom.xml
<!-- neo4j的依赖包 -->
<dependency>
    <groupId>org.neo4j</groupId>
    <artifactId>neo4j</artifactId>
    <version>3.4.18</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13</version>
    <scope>test</scope>
</dependency>

启动和关闭数据库

  • 示例:
package com.sunxiaping.neo4j;

import org.junit.Before;
import org.junit.Test;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Transaction;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;

import java.io.File;

public class EmbeddedNeo4jTest {

    GraphDatabaseService graphDb = null;

    @Before
    public void before() {
        //数据库文件的目录地址
        String storeDir = "D:\\develop\\Neo4j Desktop\\data\\neo4jDatabases\\database-420aa183-f1e8-44e5-b34e-dbe6190064f7\\installation-3.4.18\\data\\databases\\graph.db";
        //创建GraphDatabaseService实例,这代表是数据库的实例
        graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(new File(storeDir));
        Transaction transaction = graphDb.beginTx();
    }

    @Test
    public void after() {
        //关闭数据库
        if (null != graphDb) {
            graphDb.shutdown();
        }
    }


    /**
     * 连接数据库
     */
    @Test
    public void connectDb() {
        System.out.println("连接数据库..." + graphDb);
    }

}

操作Neo4j的应用示例

  • 示例:基本操作
package com.sunxiaping.neo4j;

import org.junit.Before;
import org.junit.Test;
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import org.neo4j.io.fs.FileUtils;

import java.io.File;
import java.io.IOException;
import java.util.Map;

public class EmbeddedNeo4jTest {

    GraphDatabaseService graphDb = null;
    Transaction transaction = null;
    String storeDir = null;

    @Before
    public void before() {
        //数据库文件的目录地址
        storeDir = "D:\\develop\\neo4j-community-3.5.19\\data\\databases\\graph.db";
        //创建GraphDatabaseService实例,这代表是数据库的实例
        graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(new File(storeDir));
        transaction = graphDb.beginTx();
    }

    @Test
    public void after() {
        //关闭数据库
        if (null != graphDb) {
            graphDb.shutdown();
        }
    }

    /**
     * 通过删除数据库文件的方式创建数据库
     */
    @Test
    public void deleteDb() throws IOException {
        FileUtils.deleteRecursively(new File(storeDir));
    }

    /**
     * 新增节点和关系
     */
    @Test
    public void createDataTest() {
        try {
            //创建节点
            Node firstNode = graphDb.createNode();
            firstNode.setProperty("Spring Festival", "春节");
            firstNode.setProperty("Peking Opera", "京剧");
            firstNode.setProperty("Dumpling", "饺子");
            firstNode.addLabel(Label.label("China"));

            //创建节点
            Node secondNode = graphDb.createNode();
            secondNode.setProperty("generous", "慷慨");
            secondNode.setProperty("be ready to help others", "乐于助人");
            secondNode.setProperty("Hospitality", "热情好客");
            secondNode.addLabel(Label.label("Person"));
            secondNode.addLabel(Label.label("Chinese"));

            //创建关系
            Relationship relationship = firstNode.createRelationshipTo(secondNode, RelationshipType.withName("CountryPeople"));
            relationship.setProperty("message", "国家和人");

            System.out.println("============firstNode===========");
            Object spring_festival = firstNode.getProperty("Spring Festival");
            System.out.println("spring_festival = " + spring_festival);
            Object peking_opera = firstNode.getProperty("Peking Opera");
            System.out.println("peking_opera = " + peking_opera);
            Object dumpling = firstNode.getProperty("Dumpling");
            System.out.println("dumpling = " + dumpling);

            Map<String, Object> allProperties = firstNode.getAllProperties();
            System.out.println("allProperties = " + allProperties);
            Iterable<Label> labels = firstNode.getLabels();
            System.out.println("labels = " + labels);

            System.out.println("============secondNode===========");
            Object generous = secondNode.getProperty("generous");
            System.out.println("generous = " + generous);
            Object be_ready_to_help_others = secondNode.getProperty("be ready to help others");
            System.out.println("be_ready_to_help_others = " + be_ready_to_help_others);
            Object hospitality = secondNode.getProperty("Hospitality");
            System.out.println("hospitality = " + hospitality);

            System.out.println("============relationship===========");
            Object message = relationship.getProperty("message");
            System.out.println("message = " + message);

            //提交事务
            transaction.success();
        } catch (Exception e) {
            transaction.failure();
        } finally {
            transaction.close();
        }
    }


    /**
     * 获取节点和关系
     */
    @Test
    public void getDataTest() {
        try {

            ResourceIterator<Node> firstNodes = graphDb.findNodes(Label.label("China"));
            firstNodes.forEachRemaining(node -> {

                System.out.println("node = " + node.getAllProperties());

                Iterable<Relationship> relationships = node.getRelationships();
                relationships.forEach(relationship -> {

                    System.out.println("relationship = " + relationship.getType());

                    Node endNode = relationship.getEndNode();

                    System.out.println("endNode = " + endNode.getAllProperties());
                });
            });

            //提交事务
            transaction.success();
        } catch (Exception e) {
            transaction.failure();
        } finally {
            transaction.close();
        }
    }

    @Test
    public void cypherTest() {
        try {
            String cypher = "MATCH (n) RETURN n";
            Result result = graphDb.execute(cypher);

            while (result.hasNext()) {
                Map<String, Object> map = result.next();
                map.forEach((key, value) -> {
                    System.out.println(key + ":" + value);
                });
            }

            //提交事务
            transaction.success();
        } catch (Exception e) {
            transaction.failure();
        } finally {
            transaction.close();
        }

    }

}

以上是关于Neo4j的Java嵌入式开发的主要内容,如果未能解决你的问题,请参考以下文章

通过 java 代码生成 db 后 Neo4j 2.2.1 服务器不启动

如何可视化从嵌入式 Neo4j Java 应用程序创建的 Neo4j 图形数据库

使用 neo4j 嵌入式 java api 为关系添加权重

腾讯云数据库产品副总监邵宗文:图数据库及应用场景

Neo4j 插入需要更多时间

知识图谱现学现用(Django 2.2 + Neo4j 3.5)