鳥哥的Neo4j私房菜(三)

那就寫在前面吧

上一篇博文中我們介紹了Neo4j獨(dú)特的查詢語言Cypher的用法魏割,了解了Cypher的用法之后澎羞,我們就可以自行安裝Neo4j然后在其自帶的瀏覽器客戶端使用Cypher查詢了。
默認(rèn)的訪問地址是:http://localhost:7474/,通過這種方式我們就能比較直觀的查看查詢結(jié)果。但是在實(shí)際的項(xiàng)目中,這種方式只能作為輔助践盼,我們實(shí)際要操作Neo4j有兩種主要的方式:java API、Spring Data Neo4j宾巍。使用java API的方式比較繁瑣咕幻,因此我們主要還是用Spring Data Neo4j來訪問圖數(shù)據(jù)庫。

Spring Data Neo4j簡介

Spring Data Neo4j是一個(gè)對(duì)象-圖形映射(OGM) 框架顶霞,是為了簡化開發(fā)者的工作而創(chuàng)建的(目前只有Java具有)肄程,或者說是滿足那些需要或者想要用它與基于POJO域模型工作的開發(fā)者锣吼,在這種情況下, 所有的數(shù)據(jù)都存儲(chǔ)在Neo4j中蓝厌。
它的目的是通過處理所有低層工作和從Neo4j讀域?qū)嶓w并寫回去所必需的映射邏輯來提高效率玄叠。這將使你騰出時(shí)間把重點(diǎn)放在寫代碼上——即業(yè)務(wù)邏輯
作為Spring Data的子項(xiàng)目之一拓提,Spring Data Neo4j與其他的OGM框架一樣读恃,在項(xiàng)目中扮演著連接底層的Neo4j數(shù)據(jù)庫與域模型的重要角色。具體的架構(gòu)如下圖所示:

SDN連接Neo4j與域模型

注意:SDN不適合一次處理任意類型的大量數(shù)據(jù)的場景代态。要加載或存儲(chǔ)的任何邏輯在一次操作中超過10000個(gè)單元對(duì)SDN來說不是一個(gè)好的選擇寺惫。另外,通過提供了一個(gè)間接層蹦疑,SDN會(huì)比僅僅使用核心API慢西雀,因此,如果速度和性能是考慮的最重要因素的話歉摧,最好還是使用其本身的API艇肴。

建立模型

模型主要包含了節(jié)點(diǎn)與關(guān)系的信息,其中節(jié)點(diǎn)依然是在普通的POJO對(duì)象上加上Neo4j獨(dú)有的注解來構(gòu)建叁温。
下面我們來看一個(gè)簡單的節(jié)點(diǎn)例子再悼,它表示一個(gè)作業(yè)Job

@NodeEntity
public class Job {

    @GraphId 
    private Long id;

    @Indexed
    private String name;
    
    private String description;
    
    private String state;

    private Job() {
        // Empty constructor required as of Neo4j API 2.0.5
    };

    public Job(String name) {
        this.name = name;
    }

    @Relationship(type = "DEPEND", direction = Relationship.UNDIRECTED)
    public Set<Job> depends;

    // getter and setter methods
    。券盅。帮哈。
}

@NodeEntity 注解用于標(biāo)識(shí)它表示一個(gè)節(jié)點(diǎn),用于類的前面
@GraphId 可以理解為Neo4j自動(dòng)為節(jié)點(diǎn)生成的唯一性標(biāo)識(shí)Id
@Indexed 用于節(jié)點(diǎn)的屬性上锰镀,可以為該屬性創(chuàng)建索引,提高其查詢效率

關(guān)系實(shí)體的例子如下

@RelationshipEntity(type = "DEPEND")
public class depend {

    @GraphId 
    private Long relationshipId;

    @StartNode
    Job startJob;
    
    @EndNode
    Job endJob;
    
    private String property;

}

@RelationshipEntity 注解用于標(biāo)識(shí)它表示一個(gè)節(jié)點(diǎn)咖刃,用于類的前面泳炉。使用type可以關(guān)聯(lián)關(guān)系的名字"DEPEND"
@StartNode 表示關(guān)系的起始節(jié)點(diǎn)(關(guān)系出)
@EndNode 表示關(guān)系的終止節(jié)點(diǎn)(關(guān)系進(jìn))

上面的關(guān)系表示作業(yè)之間存在單向的依賴關(guān)系,這種比較簡單的關(guān)系可以不用專門創(chuàng)建一個(gè)關(guān)系類來標(biāo)識(shí)嚎杨,像上面Job節(jié)點(diǎn)中定義的那樣花鹅,我們可以使用一個(gè)注解來標(biāo)識(shí)這種關(guān)系
@Relationship(type = "DEPEND", direction = Relationship.UNDIRECTED)

創(chuàng)建Repository

如何能與這些實(shí)體交互和怎樣能加載并保存來自于或回到圖形數(shù)據(jù)庫中的POJO實(shí)體?
Spring Data Neo4j為我們提供了三種方式來實(shí)現(xiàn)枫浙。

① 支持Spring的配置
config入口做許多初始化工作刨肃,例如,可以將storeDirectory屬性作為一個(gè)方便的方式來引用圖形數(shù)據(jù)庫(如果數(shù)據(jù)庫不存在就創(chuàng)建一個(gè)新數(shù)據(jù)庫)箩帚。在SDN 3.0以前的版本中真友,使用base-package屬性指定域?qū)嶓w定義所在的目錄或目錄列表是強(qiáng)制性的。

方式一:配置XML文件

② Neo4jTemplate類
Neo4jTemplate是一個(gè)SDN類紧帕,能用于實(shí)例化盔然,可以直接使用或當(dāng)Spring初始化時(shí)用于你的應(yīng)用程序桅打。通過充分利用具有依賴注入(DependencyInjection, DI)函數(shù)的Spring框架愈案,我們可以更加專注于業(yè)務(wù)邏輯挺尾,而不用關(guān)心更多的樣板代碼(如樣板事務(wù)代碼)。

方式二:使用Neo4jTemplate類

③ 資源庫
Spring Data Neo4j為我們提供了資源庫的方式來封裝了常用的17種對(duì)模型的操作方法站绪,比如保存遭铺、刪除、按照id查詢等等恢准。我們要做的僅僅是創(chuàng)建一個(gè)接口魂挂,然后繼承GraphRepository接口,就可以使用資源庫中已經(jīng)封裝好的方法顷歌。

資源庫的類結(jié)構(gòu)圖

如果我們想要擴(kuò)展資源庫锰蓬,那么就需要在我們的接口中編寫新的業(yè)務(wù)方法來完成,這里可以使用注解@Query眯漩,然后編寫具體的Cypher語句芹扭。
下面是一個(gè)例子:

public interface JobRepository extends GraphRepository<Job> {

    Job findByName(@Param("name") String name);
    
    // depth from 1 - 5,return job's name,path's length and node's name
    // MATCH (n:Job) where n.name="PDM_F_T00_CNR_PARM" with n match p = (n) - [d:DEPEND*1..5] -> (m:Job)  return m.name,length(p),extract(x in nodes(p) | x.name)
    @Query("MATCH (n:Job) where n.name={name} with n match p = (n) - [d:DEPEND*1..5] -> (m:Job)  return m")
    Collection<Job> findDepthJob(@Param("name") String name);

}

可以看到在Cypher語句中是如何獲取參數(shù)name的赦抖,使用{name}就可以獲取下面方法中傳入的name參數(shù)了舱卡。

小結(jié)

這篇博文主要介紹了Spring Data Neo4j如何使用來簡化我們的開發(fā),通過這幾篇博文的介紹队萤,我們已經(jīng)了解了搭建一個(gè)簡單的Neo4j項(xiàng)目所需要的必備知識(shí)轮锥。想要了解更多Neo4j以及Spring Data Neo4j的信息,請(qǐng)前往它們的官網(wǎng)查看其官方文檔要尔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舍杜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子赵辕,更是在濱河造成了極大的恐慌既绩,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件还惠,死亡現(xiàn)場離奇詭異饲握,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蚕键,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門救欧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锣光,你說我怎么就攤上這事笆怠。” “怎么了嫉晶?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵骑疆,是天一觀的道長田篇。 經(jīng)常有香客問我,道長箍铭,這世上最難降的妖魔是什么泊柬? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮诈火,結(jié)果婚禮上兽赁,老公的妹妹穿的比我還像新娘。我一直安慰自己冷守,他們只是感情好刀崖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拍摇,像睡著了一般亮钦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上充活,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天蜂莉,我揣著相機(jī)與錄音,去河邊找鬼混卵。 笑死映穗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的幕随。 我是一名探鬼主播蚁滋,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赘淮!你這毒婦竟也來了辕录?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤梢卸,失蹤者是張志新(化名)和其女友劉穎踏拜,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體低剔,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年肮塞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了襟齿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枕赵,死狀恐怖猜欺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拷窜,我是刑警寧澤开皿,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布涧黄,位于F島的核電站,受9級(jí)特大地震影響赋荆,放射性物質(zhì)發(fā)生泄漏笋妥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一窄潭、第九天 我趴在偏房一處隱蔽的房頂上張望春宣。 院中可真熱鬧,春花似錦嫉你、人聲如沸月帝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嚷辅。三九已至,卻和暖如春距误,著一層夾襖步出監(jiān)牢的瞬間簸搞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工深寥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留攘乒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓惋鹅,卻偏偏與公主長得像则酝,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子闰集,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容