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)下,而不是嚴(yán)格品嚣、靜態(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ù)庫的巨大用途得到了認(rèn)可唯袄,它跟不同領(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好友推薦(可能認(rèn)識的好友)</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標(biāo)簽(一個節(jié)點可以有多個標(biāo)簽)
    match (n) set n:Person return n;
    
    
    • 語法說明(參考圖形數(shù)據(jù)庫圖形說明):
     針對 cql NO.1 
     1. 其中n為變量名(類似mysql中的別名)代表節(jié)點Node 
     2. Teachear為lable(標(biāo)簽:一個節(jié)點可以有多個標(biāo)簽)等價于mysql中的表明 teacher (標(biāo)簽一般首字母大寫)
     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 操作用于刪除標(biāo)簽和屬性。
    
    • delete和remove命令之間的相似性
     這兩個命令不應(yīng)單獨使用粥惧。
     兩個命令都應(yīng)該與match命令一起使用键畴。
    
     -- cql NO.1 刪除節(jié)點標(biāo)簽
     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標(biāo)簽
     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 依賴及其配置準(zhǔn)備

  • 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)系作者
  • 序言:七十年代末锋叨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宛篇,更是在濱河造成了極大的恐慌娃磺,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叫倍,死亡現(xiàn)場離奇詭異偷卧,居然都是意外死亡豺瘤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門涯冠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炉奴,“玉大人,你說我怎么就攤上這事蛇更≌案希” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵派任,是天一觀的道長砸逊。 經(jīng)常有香客問我,道長掌逛,這世上最難降的妖魔是什么师逸? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮豆混,結(jié)果婚禮上篓像,老公的妹妹穿的比我還像新娘。我一直安慰自己皿伺,他們只是感情好员辩,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鸵鸥,像睡著了一般奠滑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妒穴,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天宋税,我揣著相機與錄音,去河邊找鬼讼油。 笑死杰赛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的矮台。 我是一名探鬼主播淆攻,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嘿架!你這毒婦竟也來了瓶珊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤耸彪,失蹤者是張志新(化名)和其女友劉穎伞芹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡唱较,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年扎唾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片南缓。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡胸遇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出汉形,到底是詐尸還是另有隱情纸镊,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布概疆,位于F島的核電站逗威,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏岔冀。R本人自食惡果不足惜凯旭,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望使套。 院中可真熱鬧罐呼,春花似錦、人聲如沸侦高。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矫膨。三九已至,卻和暖如春期奔,著一層夾襖步出監(jiān)牢的瞬間侧馅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工呐萌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留馁痴,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓肺孤,卻偏偏與公主長得像罗晕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赠堵,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354