Neo4j

1. 什么是Neo4j?

  • Neo4j是一个高性能的NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下,而不是严格、静态的表中。但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。Neo4j因其嵌入式、高性能、轻量级等优势,越来越受到关注。
  • 官方描述
    Neo4j is a native graph database, built from the ground up to leverage not only data but also data relationships. Neo4j connects data as it’s stored, enabling queries never before imagined, at speeds never thought possible
  • 官方视频 https://neo4j.com/developer/get-started/
  • 简单来说:
      图形数据库(图形数据库也称为图形数据库管理系统或GDBMS。
          Neo4j是:
          1. 一个开源
          2. 无Schema
          3. Cypher进行类似Sql操作
          4. 基于Java开发,运行于JVM之上
    
    

2. 图形数据结构

  • 在一个图中包含两种基本的数据类型:Nodes(节点) 和 Relationships(关系)。Nodes 和 Relationships 包含key/value形式的属性。Nodes通过Relationships所定义的关系相连起来,形成关系型网络结构。


    2.png

    1.jpg

3. Neo4j应用场景

  • 3.1 我们可以将图领域划分成以下两部分:

  - 3.1.1 用于联机事务图的持久化技术(通常直接实时地从应用程序中访问)。这类技术被称为图数据库,它们和“通常的”关系型数据库世界中的联机事务处理(Online Transactional Processing,OLTP)数据库是一样的。
  - 3.1.2 用于离线图分析的技术(通常都是按照一系列步骤执行)

这类技术被称为图计算引擎。它们可以和其他大数据分析技术看做一类,如数据挖掘和联机分析处理(Online Analytical Processing,OLAP)。

图数据库一般用于事务(OLTP)系统中。图数据库支持对图数据模型的增、删、改、查(CRUD)方法。相应地,它们也对事务性能进行了优化,在设计时通常需要考虑事务完整性和操作可用性。

目前图数据库的巨大用途得到了认可,它跟不同领域的很多问题都有关联。最常用的图论算法包括各种类型的最短路径计算、测地线(Geodesic Path)、集中度测量(如PageRank、特征向量集中度、亲密度、关系度、HITS等)。那么,什么样的应用场景可以很好地利用图数据库?

3.2 目前,业内已经有了相对比较成熟的基于图数据库的解决方案,大致可以分为以下几类。

  • 3.2.1 金融行业应用
  • 反欺诈多维关联分析场景
    通过图分析可以清楚地知道洗钱网络及相关嫌疑,例如对用户所使用的帐号、发生交易时的IP地址、MAC地址、手机IMEI号等进行关联分析。


    反欺诈模型.png
  • 反洗钱模型
    反欺诈已经是金融行业一个核心应用,通过图数据库可以对不同的个体、团体做关联分析,从人物在指定时间内的行为,例如去过地方的IP地址、曾经使用过的MAC地址(包括手机端、PC端、WIFI等)、社交网络的关联度分析,同一时间点是否曾经在同一地理位置附近出现过,银行账号之间是否有历史交易信息等。


    反洗钱模型.png

3.2.2 社交网络图谱

  • 在社交网络中,公司、员工、技能的信息,这些都是节点,它们之间的关系和朋友之间的关系都是边,在这里面图数据库可以做一些非常复杂的公司之间关系的查询。比如说公司到员工、员工到其他公司,从中找类似的公司、相似的公司,都可以在这个系统内完成。


    社交关系网络模型.png
    • 社交网络:根据用户与其他用户的关系为用户推荐新的朋友(PDD好友推荐(可能认识的好友))。


      PDD.jpeg
    • 智能推荐引擎:通过分析用户有哪些朋友、用户朋友喜好的产品、用户的浏览记录等关系信息推测用户的喜好进而为用户推荐商品。

3.2.3 企业关系图谱

  • 图数据库可以对各种企业进行信息图谱的建立,包括最基本的工商信息,包括何时注册、谁注册、注册资本、在何处办公、经营范围、高管架构。围绕企业的经营范围,继续细化去查询企业究竟有哪些产品或服务,例如通过企业名称查询到企业的自媒体,从而给予其更多关注和了解。另外也包括对企业的产品和服务的数据关联,查看该企业有没有令人信服的自主知识产权和相关资质来支撑业务的开展。

  • 企业在日常经营中,与客户、合作伙伴、渠道方、投资者都会打交道,这也决定了企业对社会各个领域都广有涉猎,呈现面错综复杂,因此可以通过企业数据图谱来查询,层层挖掘信息。基于图数据的企业信息查询可以真正了解企业的方方面面,而不再是传统单一的工商信息查询


    企业知识图谱.png

4. Neo4j入门

  • 4.1 neo4j下载及其安装

    1. 官方下载neo4j https://neo4j.com/download-center/#
      (目前最新版本是4.1.1要求java的本本为11, 因此我们下载3.5的)
    1. 按照步骤安装 (参考官方 这里省略)
  • 4.2 neo4j语法cql及对比mysql语法sql

  • 4.2.1 常用语法分析- create match delete、remove、set
    • 以下语法分析拿出几个简单的例子来进行学习分析,往往现实当中cql的查询语法还是比较复杂的,但是掌握好语法一切关系查询在cql面前都是浮云
  • 4.2.1.1 create-创建语句
    -- cql NO.1 
    create (n:Teacher{name:"石", sex:"男", age:40}) return n;
    --sql
    insert into teacher(name, sex, age) values("石","男",40);
    
    -- cql NO.2 创建两个学生 
    create (n:Student{name:"彭", sex:"男", age:56}) return n;
    create (n:Student{name:"小翠", sex:"女", age:18}) return n;
    
    -- sql
    insert into student(name, sex, age) values("石","男",56);
    insert into student(name, sex, age) values("小翠","女",18);
    
    -- cql NO.3 建立教师和学生、学生和学生直接的关系
    match(n:Teacher{name:"石"}), (m:Student{name:"彭"}) create (n)-[r:is_teacher]->(m);
    match(n:Teacher{name:"石"}), (m:Student{name:"小翠"}) create (n)-[r:is_teacher]->(m);
    match(n:Student{name:"彭"}), (m:Student{name:"小翠"}) create (n)-[r:Love]->(m);
    match(n:Student{name:"小翠"}), (m:Teacher{name:"石"}) create (n)-[r:Is_kinfolk]->(m);
    
    -- cql NO.4 修改关系type
    MATCH (n)-[r:is_teacher]->(m)
    CREATE (n)-[r2:Is_teacher]->(m)
    SET r2 = r
    WITH r
    DELETE r;
    
    -- 节点创建Person标签(一个节点可以有多个标签)
    match (n) set n:Person return n;
    
    
    • 语法说明(参考图形数据库图形说明):
     针对 cql NO.1 
     1. 其中n为变量名(类似mysql中的别名)代表节点Node 
     2. Teachear为lable(标签:一个节点可以有多个标签)等价于mysql中的表明 teacher (标签一般首字母大写)
     3. name、sex、age为节点Node的properties(属性) 相当于mysql一条记录
    
  • 4.2.2 match-查询语法(无关系查询)
    -- cql 
    -- 查询所有的学生
     match (n:Student) return  limit 100;
    -- sql
     select * from student limit 100;
    
    -- 查询年龄大于17的节点 
     match (n:Student) where n.age>17 return n;
     match (n:Student) where n.age>30 return n;
    -- sql
     select *  from student where age>17;
    
    -- 查询年龄大于17的节点
     match (n:Person) where n.age>30 return n;
     match (n) where n.age>30 return n;
    
    -- 范围查询:查询年龄是18和56的节点
     match (n) where n.age in [18,56] return n
    -- sql
     select *  from student as s left teacher as t on s.teacher_id=t.id where s.age in (18,56) and t.age in (18,56);
    
    
  • 4.2.3 match-查询语法(关系查询)
    -- cql NO.1 查询谈恋爱的节点
     match ct=(n)-[r:Love]-(m) return ct;
     match (n)-[r:Love]-(m) return n, m;
    
     -- cql NO.2 查询有师生关系的节点
     match (n)-[r:Is_teacher]-(m) return n, m;
    
     -- cql NO.3 深度查询
     match data=(n)-[*1..3]->(m) where id(n)=0 return data;
     match data=(n)-[r:Is_teacher]->(m)-[r1:Is_friend]-(o) where n.name="石" return data;
    
    
    • 语法说明(参考: 上面图形数据库图形说明):
    
     1. 针对 cql NO.1 查询谈恋爱的学生
        两个查询sql虽然一样但是在java结果集返回中有明显的区别
     2. 针对NO.3 深度查询
        两个查询返回结果有明显区别,根据具体的业务场景来进行选择
    
  • 4.2.4 delete、remove-删除语法
    • delete和remove命令之间的主要区别
    delete 操作用于删除节点和关联关系。
    remove 操作用于删除标签和属性。
    
    • delete和remove命令之间的相似性
     这两个命令不应单独使用。
     两个命令都应该与match命令一起使用。
    
     -- cql NO.1 删除节点标签
     MATCH (m:Person) remove m:Person;
     -- cql NO.2 删除节点属性
     match (n:Person{name:"石"}) remove n.name return n;
     -- sql
     delete from teacher where name="石";
     
    
    
  • 4.2.5 set-更新语法
     -- cql NO.1 更新指定节点
     match (n:Person) where id(n)=0 set n.name="石" return n;
     -- cql NO.2 对某个节点Node添加label标签
     match (n) where id(n)=0 set n:JAVA_VUE return n;
     -- sql
     update teacher set name="石" where id = 0;
    
    
  • 4.3 语法总结
    • 从上面demo当中可以看出Neo4j 和 mysql 语法之前有相似之处,也有明显的区别;
    • neo4j 对复杂的关系网处理显的很随意,但针对mysql关系型数据库显的力不从心;
    • neo4j 支持 java、javascript、python、.net、

5. springboot 整合 neo4j(采用原生集成方式)

5.1 neo4j对jvm环境要求

  • 官方文档注明:
     Please note the minimum version compatibilities:
     Neo4j Server 3.x - Java 8
     Neo4j Server 4.x - Java 11
    

5.2 依赖及其配置准备

  • springboot pom配置如下

        
            org.neo4j.driver
            neo4j-java-driver
            4.1.1
        
        
            org.neo4j.driver
            neo4j-java-driver
            4.1.1
        
    
  • application.yml配置如下

           spring
             data:
               neo4j:
                 uri: bolt://localhost:7687 #这里采用bolt协议,当然然也可以适应http协议进行连接
                 username: neo4j
                 password: neo4j
    

5.2 neo4j配置驱动连接

  • 5.2.1 驱动配置类
                
        import org.neo4j.driver.AuthTokens;
        import org.neo4j.driver.Driver;
        import org.neo4j.driver.GraphDatabase;
        import org.springframework.beans.factory.annotation.Value;
        import org.springframework.context.annotation.Bean;
        import org.springframework.context.annotation.Configuration;
    
        import java.sql.Connection;
        import java.sql.DriverManager;
        import java.sql.SQLException;
    
        @Configuration
        public class Neo4jConfig {
    
            @Value("${spring.data.neo4j.uri}")
            private String uri;
            @Value("${spring.data.neo4j.username}")
            private String userName;
            @Value("${spring.data.neo4j.password}")
            private String password;
    
    
            @Bean
            public Driver getDriver() {
                try {
                    Connection connection = DriverManager.getConnection(uri, userName, password);
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                return GraphDatabase.driver(uri, AuthTokens.basic(userName, password));
            }
        }   
    
  • 5.2.2 创建session实例
```java
            
    
import org.neo4j.driver.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

import static org.neo4j.driver.Values.parameters;

@RestController
@RequestMapping(value = "/neo4j")
public class Neo4jController {


    @Autowired
    private Driver driver;


    @GetMapping(value = "/{id}")
    public Object gertTeacherById(@PathVariable(value = "id") Long id) {
        try (Session session = driver.session()) {
            return session.readTransaction(rt -> {
                Result result = rt.run("match (n) where id(n)=$id return n,m, r", parameters("id", id));
               Record re = result.single();
               final Value v = re.get("n");
               return v.asMap();
            });
        }
    }
}  
```
  • 启动项目 浏览器输入 http://127.0.0.1:9001/neo4j/0
    输出结果
    {
         name: "石",
         age: 40,
         sex: "男"
     }
    
  1. 总结
    上述讲述了neo4j的感念,常用语法,已经整合java入门demo,

你可能感兴趣的:(Neo4j)