文档章节

图数据库 Neo4j 之 Java Api 的使用

绝世武神
 绝世武神
发布于 2017/08/10 15:41
字数 1040
阅读 1.6K
收藏 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
博文 32
码字总数 47915
作品 0
海淀
程序员
私信 提问
加载中

评论(0)

关于neo4j的嵌入式和驱动包模式该如何选择,还请解惑

<div class="topic_content"> 1.使用驱动包模式开发是否就只能用cypher语句(或者结合apoc)来进行图的遍历。2.驱动包模式查询结果返回的是一个ResultSet对象,是否需要自己手动创建node,p...

osc_havqwnro
2019/08/01
4
0
图数据库neo4j的介绍与入门使用

介绍   Neo4j 是一款较为领先的图数据库,由java编写,图数据库与常用的关系型/非关系型数据库不同,它没有表的概念,主要的存储对象为结点、关系(边)以及属性。 存储形式   1、结点:...

osc_617kp6ei
2019/05/29
1
0
Neo4j教程 Neo4j视频教程 Neo4j 图数据库视频教程

课程名称 课程发布地址 地址: 腾讯课堂《Neo4j 图数据库视频教程》 https://ke.qq.com/course/327374?tuin=442d3e14 作者 庞国明,《Neo4j权威指南》副主编、《Neo4j 3.x 入门经典》翻译 邮...

osc_73m98sy1
2018/09/01
9
0
Neo4j视频教程 Neo4j 图数据库视频教程

课程发布地址 地址: 腾讯课堂《Neo4j 图数据库视频教程》 https://ke.qq.com/course/327374?tuin=442d3e14 作者 庞国明,《Neo4j权威指南》副主编、《Neo4j 3.x 入门经典》翻译 邮箱:pangg...

osc_bex5p3qd
2018/08/29
11
0
图数据库Neo4j简介以及安装部署

Neo4j 是当今市场图数据库的领袖, 它具有可伸缩性和高可用性等企业级功能,是满足我们需求的最佳选择. 图数据库解决哪类问题? 为什么选择Neo4j? 关系型数据库不能很好地处理关系 NoSQL 数据...

jinyan2049
2019/07/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PDF如何添加下划线?迅捷PDF编辑器一键添加

“在PDF文件中如何添加下划线?”最近,很多办公室小伙伴都向小编咨询这样一个问题。我们常常需要接触、使用到PDF文件,通过查看、阅读、编辑PDF文件以处理各种各样的学习、工作任务。当我们...

dawda
58分钟前
52
0
go中gin框架+realize实现边写代码边编译,热更新

最近看到了热加载,相关的,就搜索了goland实现热加载 发现了一个插件realize https://github.com/oxequa/realize 然后,为了自己撸代码更方便,配合gin写个教程 1.准备 go get github.com/...

osc_ho8dcqsx
58分钟前
43
0
CAP理论的理解

转自:https://www.cnblogs.com/mingorun/p/11025538.html CAP理论的理解 CAP理论作为分布式系统的基础理论,它描述的是一个分布式系统在以下三个特性中: 一致性(Consistency) 可用性(Ava...

osc_5rgbamh9
59分钟前
43
0
求所有科目都大于80分的学生姓名

   蠢蠢的我=》 select t1.name from ( select name,count(*) as num from table t where fenshu>80 group by name) t1join( select name,count(kecheng) as num from table group ......

osc_gk4myeyk
今天
36
0
Memcache(1.1)Memcache 基本概述与架构概述

【1】基本概念介绍 官网:https://memcached.org/ 【1.1】memcache与memcached memcache:是早期使用的,与php结合的,是Php中常用的一个原生插件,完全在php框架内开发的 memcached:是建立...

osc_7ie26pzn
今天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部