Neo4j详细介绍及使用教程

本文介绍了Neo4j图数据库的基本概念、优缺点以及常见应用场景,如金融反洗钱模型和社交网络。Neo4j因其针对图形数据的优化和高效的关系查询语言而受到青睐。文章提供了下载安装步骤,并详细讲解了如何进行数据插入、查询和删除,包括CREATE、MERGE和MATCH等操作。此外,还展示了使用JAVA进行Neo4j嵌入式访问的示例代码。

一、Neo4j介绍

1.Neo4j简介

Neo4j是一个高性能的,NOSQL图形数据库。它是一个嵌入式的、高性能(基于磁盘的)、具备完全的事务特性的Java持久化引擎,该引擎具有成熟数据库的所有特性,它在图(网络)中而不是表中存储数据。

2.图数据库简介

(1)特点:它的数据模型主要是以节点和关系(边)来体现,也可处理键值对。它的优点是快速解决复杂的关系问题。

(2)特征:
①包含节点和边;
②节点上有属性(键值对);
③边有名字和方向,并总是有一个开始节点和一个结束节点;
④边也可以有属性。

如下图的反洗钱模型:
在这里插入图片描述

(3)图计算
基本的数据结构表达就是:
G=(V, E)
V=vertex(节点)
E=edge(边)

3.Neo4j的优缺点

(1)优点
①底层数据存储专门针对图形数据的特点进行了优化,在处理关系数据方面比其他数据库有更高的性能。
②专门为关系数据设计的查询语言更便于关系数据的操作。
③没有表结构的概念,它比SQL更灵活。
④自动为数据建立合适的索引(根据数据的标签),避免索引管理的麻烦。
⑤支持高可用主从集群部署。
⑥借助图形平台等辅助工具帮助开发人员快速构建完整的关系数据平台。
(2)neo4j的缺点
①图数据结构导致写入性能差。
②只支持java和基于jvm的语言,社区版不能使用集群。
③社区不够活跃,资料不丰富。
(3)为什么选用Neo4j
Neo4j发布时间早,产品较为成熟稳定,目前是市场使用率最高的图数据库,文档和各种技术博客较多

4.Neo4j的常见应用场景

(1)金融行业的反洗钱模型
(2)社交网络图谱
(3)企业关系图谱

二、使用教程

1.下载安装

(1)下载
需要jdk环境:Neo4j v4 需使用 jdk11以上版本;v5需要jdk17以上版本。我本地是jdk1.8版本,所以选择v3的版本。
v4、v5下载可以到官网:https://neo4j.com/download-center/,但是官网找不到v3版本。
这里放上v3.5.5版本的资源:链接:https://pan.baidu.com/s/1Wx4MwHRCRKUOXUcUvWctmA 提取码:0g30
(2)配置环境变量
新建用户变量NEO4J_HOME,值为D:\tools\neo4j\neo4j-community-3.5.5-windows\neo4j-community-3.5.5
然后在系统变量Path中添加%NEO4J_HOME%\bin
(3)启动
在cmd中运行D:\tools\neo4j\neo4j-community-3.5.5-windows\neo4j-community-3.5.5\bin>neo4j console
然后进入http://localhost:7474/browser/就可以访问了
然后会提示你输入用户名密码 默认是neo4j/neo4j

2.数据插入和查询

(1)基本概念

Nodes:节点,用于图形数据记录
Relationships:关系,用于连接节点
Properties:属性,用于命名数据值

(2)基本语法

首先我们找到创建图的入口,然后再在最上方运行命令即可
在这里插入图片描述

Ⅰ.CREATE操作——创建

①添加节点:
CREATE (n:Person {name:‘小李’, born:1989}) RETURN n;
注:CREATE是创建操作,n代表该节点,相当于一个只在当前语句生效的局部变量,Person是标签,代表节点的类型。花括号{}代表节点的属性。RETURN 代表返回该数据,也可以不return直接插入

批量操作:
CREATE (a:Person {name:‘老张’, born:1990})
CREATE (b:Person {name:‘老王’, born:1995})
CREATE (c:Person {name:‘李华’, born:1993})
CREATE (d:Country {name:‘美国’, des:‘美利坚共和国’})
CREATE (n:Country {name:‘中国’, des:‘中华人民共和国’})

此时我们的图:

②创建关系:
CREATE (a:Person {name:‘小李’, born:1989})-[r:所属国家]->(b:Country {name:‘中国’, des:‘中华人民共和国’}) return a,r,b
在一个Person与Country之间建立一个“所属国家”关系,并且这个关系是有方向的

Ⅱ.MERGE——创建或更新

merge等于是create+match,如果节点中有重复数据,就不会添加进去
①创建节点:
MERGE (n:Person {name:‘小胡’, born:1990})
②创建关系:
MATCH (a:Person {name:‘李华’, born:1993}), (b:Country {name:‘美国’, des:‘美利坚共和国’})
MERGE (a)-[r:所属国家]->(b)
在这里插入图片描述

③更新操作:
MERGE (n:Person {name:‘老王’})
ON MATCH SET n.born = 2023
RETURN n

Ⅲ.Match操作——查找指定的图数据

①普通查询:
MATCH (n:Person {born:1990}) RETURN n
指查询一个标签(Label)为Person、born为1990的节点。
在这里插入图片描述
②查询所有对外有关系的节点(注意这里箭头的方向)
MATCH (a)–>() RETURN a
③查询所有有关系的节点
MATCH (a)–() RETURN a
④修改操作
MATCH (a:Person {name:‘老王’}) SET a.born=1988 RETURN a
⑤删除属性
MATCH (a:Country {name:‘美国’}) REMOVE a.des RETURN a

Ⅳ.DELETE操作——删除节点

①删除
MATCH (a:Person {name:‘李华’}) DETACH DELETE a
Delete操作会删除节点与关系。
②删除全部:
MATCH (n) DETACH DELETE n

3.JAVA实战

(1)首先引入maven包

  <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j</artifactId>
            <!--<version>5.5.0</version>-->
            <version>3.5.5</version>
        </dependency>

(2)使用嵌入式的方式访问Neo4j(还有服务的方式,可以自行了解)

package com.example.user.dal;

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

import java.io.File;

///neo4j使用--嵌入式
public class neo4jRepository {

    //创建节点的标签枚举
    public enum MyLabels implements Label {
        //城市
        CITY,
        //省会
        CAPITAL;
    }

    //创建关系的标签枚举
    public enum MyRelation implements RelationshipType {
        //所属
        BELONG

    }

    //全局只创建一个GraphDatabaseService实例
    GraphDatabaseService graphDb;


    //创建file 指明我们想要操作的neo4j数据库的数据文件的路径
    private static final File databaseDirectory = new File("D:\\tools\\neo4j\\neo4j-community-3.5.5-windows\\neo4j-community-3.5.5\\data\\databases\\graph.db");

    public static void main(String[] args) {
        neo4jRepository repository = new neo4jRepository();
        /*repository.createDb();
        repository.shutDown();*/

        //repository.searchCapital("浙江");

        repository.searchProvince("郑州");
    }

    void createDb() {
        System.out.println( "打开数据库 ..." );
        //创建graphDb实例, 参数是我们想要操作的neo4j数据库的数据文件的路径, 以打开一个数据库
        graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(databaseDirectory);

        //创建事务
        try ( Transaction tx = graphDb.beginTx() ) {

            Node city1 = graphDb.createNode(new CaseLabel(String.valueOf(MyLabels.CITY)));
            city1.setProperty("name", "浙江");
            city1.setProperty("abbreviation", "浙");

            Node city2 = graphDb.createNode(new CaseLabel(String.valueOf(MyLabels.CITY)));
            city2.setProperty("name", "河南");
            city2.setProperty("abbreviation", "豫");


            Node cap1 = graphDb.createNode(new CaseLabel(String.valueOf(MyLabels.CAPITAL)));
            cap1.setProperty("name", "杭州");

            Node cap2 = graphDb.createNode(new CaseLabel(String.valueOf(MyLabels.CAPITAL)));
            cap2.setProperty("name", "郑州");

            cap1.createRelationshipTo(city1,MyRelation.BELONG);
            cap2.createRelationshipTo(city2,MyRelation.BELONG);

            //提交事务
            tx.success();
        }


    }

    //根据省份查省会
    void searchCapital(String provinceName) {
        graphDb = new GraphDatabaseFactory().newEmbeddedDatabase( databaseDirectory );

        try ( Transaction tx = graphDb.beginTx())
        {

            Node startNode = graphDb.findNode(new CaseLabel(String.valueOf(MyLabels.CITY)), "name", provinceName);

            //Direction介绍:从起始节点来看,它是一个传出关系OUTGOING;从结束节点看是传入关系INCOMING;方向不重要时使用BOTH=OUTGOING+INCOMING
            Iterable<Relationship> iterable = startNode
                    .getRelationships(MyRelation.BELONG, Direction.INCOMING);
            for (Relationship r : iterable) {

                Node node = r.getStartNode();
                long id = node.getId();
                String name = (String)node.getProperty("name");


                System.out.println(id + " " + name+ " ");
            }
            tx.success();
            tx.close();
            tx.success();
        }

    }

    //根据省会查省份
    void searchProvince(String capitalName) {
        graphDb = new GraphDatabaseFactory().newEmbeddedDatabase( databaseDirectory );

        try ( Transaction tx = graphDb.beginTx())
        {

            Node startNode = graphDb.findNode(new CaseLabel(String.valueOf(MyLabels.CAPITAL)), "name", capitalName);

            //Direction介绍:从起始节点来看,它是一个传出关系OUTGOING;从结束节点看是传入关系INCOMING;方向不重要时使用BOTH=OUTGOING+INCOMING
            Iterable<Relationship> iterable = startNode
                    .getRelationships(MyRelation.BELONG, Direction.OUTGOING);
            for (Relationship r : iterable) {
                //注意这里使用EndNode
                Node node = r.getEndNode();
                long id = node.getId();
                String name = (String)node.getProperty("name");
                String abbreviation = (String)node.getProperty("abbreviation");

                System.out.println(id + " " + name+ " "+abbreviation);
            }
            tx.success();
            tx.close();
            tx.success();
        }

    }

    void shutDown()
    {
        System.out.println( "关闭数据库 ..." );
        // 关闭数据库
        graphDb.shutdown();
    }

    private static void registerShutdownHook( final GraphDatabaseService graphDb )
    {
        // 用来确保数据库正确关闭的 一个回调方法
        Runtime.getRuntime().addShutdownHook( new Thread()
        {
            @Override
            public void run()
            {
                graphDb.shutdown();
            }
        } );
    }
}

(3)测试,这里需要关闭neo4j的cmd窗口。这里三块代码按顺序执行,调用时需要把其他步骤的代码注释掉:
第一步是插入数据,第二步是查省会,第三步是查省份。

  		/*repository.createDb();
        repository.shutDown();*/

        //repository.searchCapital("浙江");

        repository.searchProvince("郑州");

最后的图大概长这样
在这里插入图片描述

目录:网盘文件永久链接第一章 网络能源EHS安全培训 1.1_事故概率、人员资质及PPE防护简介 1.2_工程施工安全(1) 1.3_工程施工安全(2) 第二章 数据中心基础设施知识培训 2.1_数据中心发展介绍 2.2_数据中心基础设施的组成(1) 2.3_数据中心基础设施的组成(2) 2.4_常见的能耗指标 2.5_华为数据中心产品 第三章 配电基础知识 3.1_低压系统及常见的低压电气设备 3.2_常见接地系统及数据中心网络能源产品简介 第四章 UPS基础知识介绍 4.1_UPS基本原理 4.2_UPS工作模式 4.3_UPS系统配置介绍 4.4_华为UPS介绍 第五章 蓄电池基础知识培训 5.1_蓄电池概述 5.2_蓄电池分类与命名 5.3_蓄电池构造与原理 5.4_蓄电池的应用 第六章 空调系统介绍 6.1_空调系统原理 6.2_空调系统的分类 6.3_空气处理设备 6.4_空调风系统 第七章 华为精密空调基础知识 7.1_机房空调的概述(1) 7.2_机房空调的概述(2) 7.3_风冷精密空调 7.4_水冷精密空调 7.5_空调术语 第八章 监控系统基础知识 8.1_监控系统简介.mp4 您没有权限查看此视频 8.2_基本接口及通信协议介绍(1) 8.3_基本接口及通信协议介绍(2) 8.4_数据中心监控系统介绍(1) 8.5_数据中心监控系统介绍(2) 第九章 监控系统功能实现 9.1_监控系统概述 9.2_主要功能介绍1 9.3_主要功能介绍2 9.4_主要功能介绍3 9.5_华为监控系统介绍. 第十章 机房气体消防系统介绍 10.1_消防系统的概述 10.2_火灾自动报警系统 10.3_气体消防灭火系统 10.4_防排烟系统 10.5_安全疏散系统 第十一章 数据中心基础设施其他系统介绍 11.1_新风系统 11.2_机柜系统 11.3_防雷接地系统 11.4_综合布线系统及室内装修系统
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值