Neo4j

1. 什么是Neo4j?

  • Neo4j是一個高性能的NOSQL圖形數(shù)據(jù)庫,它將結(jié)構(gòu)化數(shù)據(jù)存儲在網(wǎng)絡(luò)上而不是表中。它是一個嵌入式的、基于磁盤的、具備完全的事務(wù)特性的Java持久化引擎,但是它將結(jié)構(gòu)化數(shù)據(jù)存儲在網(wǎng)絡(luò)(從數(shù)學(xué)角度叫做圖)上而不是表中。Neo4j也可以被看作是一個高性能的圖引擎,該引擎具有成熟數(shù)據(jù)庫的所有特性。程序員工作在一個面向?qū)ο蟮?、靈活的網(wǎng)絡(luò)結(jié)構(gòu)下,而不是嚴格、靜態(tài)的表中。但是他們可以享受到具備完全的事務(wù)特性、企業(yè)級的數(shù)據(jù)庫的所有好處。Neo4j因其嵌入式、高性能、輕量級等優(yōu)勢,越來越受到關(guān)注。
  • 官方描述
    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/
  • 簡單來說:
      圖形數(shù)據(jù)庫(圖形數(shù)據(jù)庫也稱為圖形數(shù)據(jù)庫管理系統(tǒng)或GDBMS。
          Neo4j是:
          1. 一個開源
          2. 無Schema
          3. Cypher進行類似Sql操作
          4. 基于Java開發(fā),運行于JVM之上
    
    

2. 圖形數(shù)據(jù)結(jié)構(gòu)

  • 在一個圖中包含兩種基本的數(shù)據(jù)類型:Nodes(節(jié)點) 和 Relationships(關(guān)系)。Nodes 和 Relationships 包含key/value形式的屬性。Nodes通過Relationships所定義的關(guān)系相連起來,形成關(guān)系型網(wǎng)絡(luò)結(jié)構(gòu)。


    2.png

    1.jpg

3. Neo4j應(yīng)用場景

  • 3.1 我們可以將圖領(lǐng)域劃分成以下兩部分:

  - 3.1.1 用于聯(lián)機事務(wù)圖的持久化技術(shù)(通常直接實時地從應(yīng)用程序中訪問)。這類技術(shù)被稱為圖數(shù)據(jù)庫,它們和“通常的”關(guān)系型數(shù)據(jù)庫世界中的聯(lián)機事務(wù)處理(Online Transactional Processing,OLTP)數(shù)據(jù)庫是一樣的。
  - 3.1.2 用于離線圖分析的技術(shù)(通常都是按照一系列步驟執(zhí)行)

這類技術(shù)被稱為圖計算引擎。它們可以和其他大數(shù)據(jù)分析技術(shù)看做一類,如數(shù)據(jù)挖掘和聯(lián)機分析處理(Online Analytical Processing,OLAP)。

圖數(shù)據(jù)庫一般用于事務(wù)(OLTP)系統(tǒng)中。圖數(shù)據(jù)庫支持對圖數(shù)據(jù)模型的增、刪、改、查(CRUD)方法。相應(yīng)地,它們也對事務(wù)性能進行了優(yōu)化,在設(shè)計時通常需要考慮事務(wù)完整性和操作可用性。

目前圖數(shù)據(jù)庫的巨大用途得到了認可,它跟不同領(lǐng)域的很多問題都有關(guān)聯(lián)。最常用的圖論算法包括各種類型的最短路徑計算、測地線(Geodesic Path)、集中度測量(如PageRank、特征向量集中度、親密度、關(guān)系度、HITS等)。那么,什么樣的應(yīng)用場景可以很好地利用圖數(shù)據(jù)庫?

3.2 目前,業(yè)內(nèi)已經(jīng)有了相對比較成熟的基于圖數(shù)據(jù)庫的解決方案,大致可以分為以下幾類。

  • 3.2.1 金融行業(yè)應(yīng)用
  • 反欺詐多維關(guān)聯(lián)分析場景
    通過圖分析可以清楚地知道洗錢網(wǎng)絡(luò)及相關(guān)嫌疑,例如對用戶所使用的帳號、發(fā)生交易時的IP地址、MAC地址、手機IMEI號等進行關(guān)聯(lián)分析。


    反欺詐模型.png
  • 反洗錢模型
    反欺詐已經(jīng)是金融行業(yè)一個核心應(yīng)用,通過圖數(shù)據(jù)庫可以對不同的個體、團體做關(guān)聯(lián)分析,從人物在指定時間內(nèi)的行為,例如去過地方的IP地址、曾經(jīng)使用過的MAC地址(包括手機端、PC端、WIFI等)、社交網(wǎng)絡(luò)的關(guān)聯(lián)度分析,同一時間點是否曾經(jīng)在同一地理位置附近出現(xiàn)過,銀行賬號之間是否有歷史交易信息等。


    反洗錢模型.png

3.2.2 社交網(wǎng)絡(luò)圖譜

  • 在社交網(wǎng)絡(luò)中,公司、員工、技能的信息,這些都是節(jié)點,它們之間的關(guān)系和朋友之間的關(guān)系都是邊,在這里面圖數(shù)據(jù)庫可以做一些非常復(fù)雜的公司之間關(guān)系的查詢。比如說公司到員工、員工到其他公司,從中找類似的公司、相似的公司,都可以在這個系統(tǒng)內(nèi)完成。


    社交關(guān)系網(wǎng)絡(luò)模型.png
    • 社交網(wǎng)絡(luò):根據(jù)用戶與其他用戶的關(guān)系為用戶推薦新的朋友(<font size=5 color= 'blue'>PDD好友推薦(可能認識的好友)</font>)。


      PDD.jpeg
    • 智能推薦引擎:通過分析用戶有哪些朋友、用戶朋友喜好的產(chǎn)品、用戶的瀏覽記錄等關(guān)系信息推測用戶的喜好進而為用戶推薦商品。

3.2.3 企業(yè)關(guān)系圖譜

  • 圖數(shù)據(jù)庫可以對各種企業(yè)進行信息圖譜的建立,包括最基本的工商信息,包括何時注冊、誰注冊、注冊資本、在何處辦公、經(jīng)營范圍、高管架構(gòu)。圍繞企業(yè)的經(jīng)營范圍,繼續(xù)細化去查詢企業(yè)究竟有哪些產(chǎn)品或服務(wù),例如通過企業(yè)名稱查詢到企業(yè)的自媒體,從而給予其更多關(guān)注和了解。另外也包括對企業(yè)的產(chǎn)品和服務(wù)的數(shù)據(jù)關(guān)聯(lián),查看該企業(yè)有沒有令人信服的自主知識產(chǎn)權(quán)和相關(guān)資質(zhì)來支撐業(yè)務(wù)的開展。

  • 企業(yè)在日常經(jīng)營中,與客戶、合作伙伴、渠道方、投資者都會打交道,這也決定了企業(yè)對社會各個領(lǐng)域都廣有涉獵,呈現(xiàn)面錯綜復(fù)雜,因此可以通過企業(yè)數(shù)據(jù)圖譜來查詢,層層挖掘信息。基于圖數(shù)據(jù)的企業(yè)信息查詢可以真正了解企業(yè)的方方面面,而不再是傳統(tǒng)單一的工商信息查詢


    企業(yè)知識圖譜.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
    • 以下語法分析拿出幾個簡單的例子來進行學(xué)習(xí)分析,往往現(xiàn)實當(dāng)中cql的查詢語法還是比較復(fù)雜的,但是掌握好語法一切關(guān)系查詢在cql面前都是浮云
  • 4.2.1.1 create-創(chuàng)建語句
    -- cql NO.1 
    create (n:Teacher{name:"石", sex:"男", age:40}) return n;
    --sql
    insert into teacher(name, sex, age) values("石","男",40);
    
    -- cql NO.2 創(chuàng)建兩個學(xué)生 
    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 建立教師和學(xué)生、學(xué)生和學(xué)生直接的關(guān)系
    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 修改關(guān)系type
    MATCH (n)-[r:is_teacher]->(m)
    CREATE (n)-[r2:Is_teacher]->(m)
    SET r2 = r
    WITH r
    DELETE r;
    
    -- 節(jié)點創(chuàng)建Person標簽(一個節(jié)點可以有多個標簽)
    match (n) set n:Person return n;
    
    
    • 語法說明(參考圖形數(shù)據(jù)庫圖形說明):
     針對 cql NO.1 
     1. 其中n為變量名(類似mysql中的別名)代表節(jié)點Node 
     2. Teachear為lable(標簽:一個節(jié)點可以有多個標簽)等價于mysql中的表明 teacher (標簽一般首字母大寫)
     3. name、sex、age為節(jié)點Node的properties(屬性) 相當(dāng)于mysql一條記錄
    
  • 4.2.2 match-查詢語法(無關(guān)系查詢)
    -- cql 
    -- 查詢所有的學(xué)生
     match (n:Student) return  limit 100;
    -- sql
     select * from student limit 100;
    
    -- 查詢年齡大于17的節(jié)點 
     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的節(jié)點
     match (n:Person) where n.age>30 return n;
     match (n) where n.age>30 return n;
    
    -- 范圍查詢:查詢年齡是18和56的節(jié)點
     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-查詢語法(關(guān)系查詢)
    -- cql NO.1 查詢談戀愛的節(jié)點
     match ct=(n)-[r:Love]-(m) return ct;
     match (n)-[r:Love]-(m) return n, m;
    
     -- cql NO.2 查詢有師生關(guān)系的節(jié)點
     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;
    
    
    • 語法說明(參考: 上面圖形數(shù)據(jù)庫圖形說明):
    
     1. 針對 cql NO.1 查詢談戀愛的學(xué)生
        兩個查詢sql雖然一樣但是在java結(jié)果集返回中有明顯的區(qū)別
     2. 針對NO.3 深度查詢
        兩個查詢返回結(jié)果有明顯區(qū)別,根據(jù)具體的業(yè)務(wù)場景來進行選擇
    
  • 4.2.4 delete、remove-刪除語法
    • delete和remove命令之間的主要區(qū)別
    delete 操作用于刪除節(jié)點和關(guān)聯(lián)關(guān)系。
    remove 操作用于刪除標簽和屬性。
    
    • delete和remove命令之間的相似性
     這兩個命令不應(yīng)單獨使用。
     兩個命令都應(yīng)該與match命令一起使用。
    
     -- cql NO.1 刪除節(jié)點標簽
     MATCH (m:Person) remove m:Person;
     -- cql NO.2 刪除節(jié)點屬性
     match (n:Person{name:"石"}) remove n.name return n;
     -- sql
     delete from teacher where name="石";
     
    
    
  • 4.2.5 set-更新語法
     -- cql NO.1 更新指定節(jié)點
     match (n:Person) where id(n)=0 set n.name="石" return n;
     -- cql NO.2 對某個節(jié)點Node添加label標簽
     match (n) where id(n)=0 set n:JAVA_VUE return n;
     -- sql
     update teacher set name="石" where id = 0;
    
    
  • 4.3 語法總結(jié)
    • 從上面demo當(dāng)中可以看出Neo4j 和 mysql 語法之前有相似之處,也有明顯的區(qū)別;
    • neo4j 對復(fù)雜的關(guān)系網(wǎng)處理顯的很隨意,但針對mysql關(guān)系型數(shù)據(jù)庫顯的力不從心;
    • neo4j 支持 java、javascript、python、.net、

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

5.1 neo4j對jvm環(huán)境要求

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

5.2 依賴及其配置準備

  • springboot pom配置如下

        <dependency>
            <groupId>org.neo4j.driver</groupId>
            <artifactId>neo4j-java-driver</artifactId>
            <version>4.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.neo4j.driver</groupId>
            <artifactId>neo4j-java-driver</artifactId>
            <version>4.1.1</version>
        </dependency>
    
  • application.yml配置如下

           spring
             data:
               neo4j:
                 uri: bolt://localhost:7687 #這里采用bolt協(xié)議,當(dāng)然然也可以適應(yīng)http協(xié)議進行連接
                 username: neo4j
                 password: neo4j
    

5.2 neo4j配置驅(qū)動連接

  • 5.2.1 驅(qū)動配置類
                
        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 創(chuàng)建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();
            });
        }
    }
}  
```
  1. 總結(jié)
    上述講述了neo4j的感念,常用語法,已經(jīng)整合java入門demo,
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容