文档章节

图数据库 Neo4j 之 Java Api 的使用

绝世武神
 绝世武神
发布于 2017/08/10 15:41
字数 1040
阅读 291
收藏 0

玩 GraphX 的时候知道了 GraphFrames ,玩 GraphFrames 的时候知道了 Cypher ,于是入坑 Neo4j。

Neo4j的安装和开发环境的搭建

https://neo4j.com/download/other-releases/,从上述链接选择合适的版本下载即可。

Neo4j-环境设置

Neo4j - Zip环境设置

上述链接仅供参考。由于不同版本之间存在差异,细节上会有些许不同。(the devil is in the details.)

笔者的安装环境:

Windows7 64

jdk-8u144-windows-x64.exe

neo4j-community-3.2.6-windows.zip

可以参考 这里 搭建开发环境。当然,也可以在 IDEA 的 maven 工程中添加如下依赖,就这么简单。

        <!-- Neo4j dependency -->
        <dependency>
          <groupId>org.neo4j</groupId>
          <artifactId>neo4j</artifactId>
          <version>3.2.6</version>
        </dependency>

Neo4j Java架构

Neo4j 提供 JAVA API 以编程方式执行所有数据库操作。它支持两种类型的API:

1、Neo4j 原生的 Java API

2、Neo4j Cypher Java API

Neo4j 原生 Java API 是一种低级别的纯 JAVA API,用于执行数据库操作。Neo4j Cypher Java API 是简单而强大的 JAVA API,用于执行所有CQL命令以执行数据库操作。

Neo4j 原生的 Java API

import org.neo4j.graphdb.*;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;

import java.io.File;

public class Neo4jNativeJavaAPI {
    private static void registerShutdownHook(final GraphDatabaseService graphDB) {
        // Registers a shutdown hook for the Neo4j instance so that it shuts down nicely
        // when the VM exits (even if you "Ctrl-C" the running example before it's completed)
        /*为了确保neo4j数据库的正确关闭,我们可以添加一个关闭钩子方法 registerShutdownHook。
         *这个方法的意思就是在jvm中增加一个关闭的钩子,
         *当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,
         *当系统执行完这些钩子后,jvm才会关闭。
         *所以这些钩子可以在jvm关闭的时候进行内存清理、对象销毁等操作。*/
        Runtime.getRuntime().addShutdownHook(
                new Thread() {
                    public void run() {
                        //Shutdown the Database
                        System.out.println("Server is shutting down");
                        graphDB.shutdown();
                    }
                }
        );
    }

    public static void main(String[] args) {
        //指定 Neo4j 存储路径
        File file = new File("D:\\neo4j-community-3.2.6\\data\\databases\\graph.db");
        //Create a new Object of Graph Database
        GraphDatabaseService graphDB = new GraphDatabaseFactory().newEmbeddedDatabase(file);
        System.out.println("Server is up and Running");
        try(Transaction tx = graphDB.beginTx()){
            /**
             * 新增User节点
             * 添加Lable以区分节点类型
             * 每个节点设置name属性
             */
            Node user1 = graphDB.createNode(MyLabels.USERS);
            user1.setProperty("name", "John Johnson");

            Node user2 = graphDB.createNode(MyLabels.USERS);
            user2.setProperty("name", "Kate Smith");

            Node user3 = graphDB.createNode(MyLabels.USERS);
            user3.setProperty("name", "Jack Jeffries");
            /**
             * 为user1添加Friend关系
             * 注:Neo4j的关系是有向的箭头,正常来讲Friend关系应该是双向的,
             * 此处为了简单起见,将关系定义成单向的,不会影响后期的查询
             */
            user1.createRelationshipTo(user2,MyRelationshipTypes.IS_FRIEND_OF);
            user1.createRelationshipTo(user3,MyRelationshipTypes.IS_FRIEND_OF);
            /**
             * 新增Movie节点
             * 添加Lable以区分节点类型
             * 每个节点设置name属性
             */
            Node movie1 = graphDB.createNode(MyLabels.MOVIES);
            movie1.setProperty("name", "Fargo");

            Node movie2 = graphDB.createNode(MyLabels.MOVIES);
            movie2.setProperty("name", "Alien");

            Node movie3 = graphDB.createNode(MyLabels.MOVIES);
            movie3.setProperty("name", "Heat");
            /**
             * 为User节点和Movie节点之间添加HAS_SEEN关系, HAS_SEEN关系设置stars属性
             */
            Relationship relationship1 = user1.createRelationshipTo(movie1, MyRelationshipTypes.HAS_SEEN);
            relationship1.setProperty("stars", 5);
            Relationship relationship2 = user2.createRelationshipTo(movie3, MyRelationshipTypes.HAS_SEEN);
            relationship2.setProperty("stars", 3);
            Relationship relationship6 = user2.createRelationshipTo(movie2, MyRelationshipTypes.HAS_SEEN);
            relationship6.setProperty("stars", 6);
            Relationship relationship3 = user3.createRelationshipTo(movie1, MyRelationshipTypes.HAS_SEEN);
            relationship3.setProperty("stars", 4);
            Relationship relationship4 = user3.createRelationshipTo(movie2, MyRelationshipTypes.HAS_SEEN);
            relationship4.setProperty("stars", 5);

            tx.success();
            System.out.println("Done successfully");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            graphDB.shutdown();    //关闭数据库
        }

        //Register a Shutdown Hook
        registerShutdownHook(graphDB);
    }
}

/**
 * Label类型枚举类
 */
enum MyLabels implements Label {
    MOVIES, USERS
}

/**
 * 关系类型枚举类
 */
enum MyRelationshipTypes implements RelationshipType {
    IS_FRIEND_OF, HAS_SEEN
}

运行完毕后,在 neo4j-community-3.2.6 目录下执行

./bin/neo4j.bat console

输出如下

2017-11-01 03:24:32.585+0000 INFO  ======== Neo4j 3.2.6 ========
2017-11-01 03:24:32.601+0000 INFO  Starting...
2017-11-01 03:24:33.552+0000 INFO  Bolt enabled on 127.0.0.1:7687.
2017-11-01 03:24:36.714+0000 INFO  Started.
2017-11-01 03:24:37.571+0000 INFO  Remote interface available at http://localhost:7474/

此时,在 http://localhost:7474/ 能够看到如下图 输入图片说明

Neo4j Cypher Java API

在 Java 程序中用 Cypher 对上图进行查询

import org.neo4j.graphdb.*;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;

import java.io.File;

public class Neo4jCypherJavaAPI {
    public static void main(String[] args) {
        //指定 Neo4j 存储路径
        File file = new File("D:\\neo4j-community-3.2.6\\data\\databases\\graph.db");
        //Create a new Object of Graph Database
        GraphDatabaseService graphDB = new GraphDatabaseFactory().newEmbeddedDatabase(file);
        System.out.println("Server is up and Running");

        try(Transaction tx = graphDB.beginTx()){
            //通过Cypher查询获得结果
            StringBuilder sb = new StringBuilder();
            sb.append("MATCH (john)-[:IS_FRIEND_OF]->(USER)-[:HAS_SEEN]->(movie) ");
            sb.append("RETURN movie");
            Result result = graphDB.execute(sb.toString());
            //遍历结果
            while(result.hasNext()){
                //get("movie")和查询语句的return movie相匹配
                Node movie = (Node) result.next().get("movie");
                System.out.println(movie.getId() + " : " + movie.getProperty("name"));
            }

            tx.success();
            System.out.println("Done successfully");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            graphDB.shutdown();    //关闭数据库
        }
    }
}

输出如下:

Server is up and Running
8 : Alien
9 : Heat
8 : Alien
7 : Fargo
Done successfully

© 著作权归作者所有

共有 人打赏支持
绝世武神
粉丝 20
博文 34
码字总数 48462
作品 0
海淀
程序员
私信 提问
Neo4j 3.0 存储过程

Neo4j 3.0 提供一个新的功能“存储过程”,该功能并不是Neo4j-Server的扩展,而是可以直接运行的。 在写这篇文章的时候,只能通过预备好的语句去执行 但是接下来他会被完全集成到Cypher语句当...

oschina
2016/03/03
3.1K
1
图形数据库、NOSQL和Neo4j

简介 在众多不同的数据模型里,关系数据模型自80年代就处于统治地位,而且有不少实现,如Oracle、MySQL和MSSQL,它们也被称为关系数据库管理系统(RDBMS)。然而,最近随着关系数据库使用案例...

欧德高
2010/09/09
4.4K
3
DataNucleus 4.1.0.M3 发布,持久层框架

DataNucleus AccessPlatform 4.1.0.M3 发布,此版本改进了 RDBMS, Neo4j, MongoDB, LDAP, XML 中对 Java 对象的检索以及数据存储支持。更多详情请看:http://goo.gl/tiVV1t 。 下载: http:/...

oschina
2015/04/06
682
1
neo4j 安装 开启 远程访问

实验环境 ubuntu 版本:ubuntu 14.04 桌面版 Neo4j版本:Neo4j 3.2.0 社区版 安装步骤 下载 Neo4j 官网下载地址:https://neo4j.com/download/ 选择“Download Communit Edtion”社区版 在“...

阿豪boy
01/08
0
0
Neo4j批量插入(Batch Insertion)

新建一个maven工程,这里不赘述如何新建maven工程。 添加Neo4j jar到你的工程 有两种方式: 上网站官网下载jar包,根据自己的系统下载不同的压缩包,详细过程不描述,请自行搜索其他博客 通过...

xiaoheike
2016/04/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

玩转docker-构建镜像

构建镜像 直接进入主题,docker的构建有两种方式,一种是通过commit命令的方式,一种是通过 Dockerfile 构建文件的方式构建,分析一下这两种方式用法,以拿构建centos为例吧,打算将本地仓库的cen...

yaukie
6分钟前
0
0
koa源码中的promise的解析

koa 是一个非常轻量优雅的 node 应用开发框架,趁着闲余时间阅读了下源代码,其中一些比较有意思的地方整理成文与大家分享一下。 洋葱型中间件机制的实现原理 我们经常把 koa 中间件的执行机...

peakedness丶
8分钟前
0
0
Html5 Canvas动画基础碰撞检测的实现

在Canvas中进行碰撞检测,大家往往直接采用游戏引擎(Cocos2d-JS、Egret)或物理引擎(Box2D)内置的碰撞检测功能,好奇的你有思考过它们的内部运行机制吗?下面将针对基本的碰撞检测技术进行讲解...

嫣然丫丫丫
11分钟前
0
0
阿里云物联网平台体验(树莓派+Python篇)

阿里云物联网平台体验(树莓派+Python篇) 虽然对阿里云物联网平台比较熟悉了,从一开始就有幸参与了飞凤平台(Link Develop 一站式开发平台的前身)的一些偏硬件接入的工作。但是同时也见证了...

阿里云官方博客
16分钟前
1
0
Java Sound Programmer Guide

Introductory Material Preface For Whom This Guide Is Intended What this Guide Describes For More Information Chapter: 1 Introduction to the Java Sound API Design Goals Who is th......

祖冲之
19分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部