大數(shù)據(jù)學習之Neo4j的自定義函數(shù)開發(fā)

本文轉(zhuǎn)載自科多大數(shù)據(jù)

一辙谜、背景介紹

用戶自定義函數(shù)树埠,顧名思義就是開發(fā)一些個性化方法去解決復雜的業(yè)務(wù)邏輯問題钾军。雖然它的功能還不夠強大窒舟,但是足夠去擴展和提升Neo4j的一些常用命令功能。

在Neo4j中袱吆,自定義函數(shù)是需求利用Java語言去獨立開發(fā)厌衙,然后生成.jar文件去部署在圖數(shù)據(jù)庫的安裝目錄plugin中,如果是集群的話绞绒,每臺服務(wù)器都需要部署婶希。再重新啟動圖數(shù)據(jù)庫才能生效。

對于自定義函數(shù)的調(diào)用蓬衡,它跟常用的Cypher方法一樣喻杈,只是函數(shù)名的規(guī)范會有限定,比如自定義函數(shù)join狰晚,它在Java工程中的目錄結(jié)構(gòu)為org.neo4j.examples筒饰,因此它在調(diào)用時的規(guī)范寫法為org.neo4j.examples.join(參數(shù))。


另外壁晒,自定義函數(shù)的結(jié)果輸出類型很多瓷们,具體如下所示:


? java.lang.Boolean or boolean

? java.lang.Double or double

? java.lang.Long or long

? java.lang.Number

? java.lang.Object

? java.lang.String or string

? java.util.List

? java.util.Map

? org.neo4j.graphdb.Node

? org.neo4j.graphdb.Relationship

? org.neo4j.graphdb.Path

? org.neo4j.graphdb.spatial.Geometry

? org.neo4j.graphdb.spatial.Point

? Map

? List


當然,現(xiàn)有的Neo4j圖數(shù)據(jù)庫也包含了很多自定義的函數(shù)秒咐,你可以在正式實踐之前去初步了解一下谬晕,在命令框輸入:CALL dbms.procedures()即可查詢到,結(jié)果輸出包含了函數(shù)名携取、用法說明和功能描述攒钳。你后期的開發(fā)也可以按照這樣的規(guī)范標準來。


二雷滋、基礎(chǔ)準備


在了解完背景介紹之后不撑,除了部署好Java和Neo4j的環(huán)境之外,你最好去按照好Maven軟件晤斩,并配置到IDE中焕檬,因為它可以極大簡化你開發(fā)的工作量。


其中澳泵,對于Maven的安裝揩页,請自行百度。不過這里提示一點烹俗,Java的版本需要為1.8爆侣,IDE可以選擇最新的STS,Maven可以選擇3.3.9版本幢妄。而對于IDE中Maven的配置兔仰,也請自行百度。


在安裝部署結(jié)束蕉鸳,你可以通過CMD命令窗口輸入:mvn -version去確認是否成功乎赴。


一切完成之后忍法,現(xiàn)在就正式在IDE中去創(chuàng)建Maven工程,其中Group Id填寫cn.lpwanger(你也可以更換)榕吼,Artifact Id填寫neo4jFuns饿序,點擊Finish即可。


接下來羹蚣,我們還需要在Maven工程的pom.xml文件引入一些依賴包原探,分別如下:



org.neo4j.driver

neo4j-java-driver

1.4.0


org.neo4j

neo4j

3.4.9

org.neo4j.test

neo4j-harness

3.4.9

test

你也可以直接通過Maven中央倉庫去搜索。如果有些公司不能從外網(wǎng)下載的話顽素,你可以在pom.xml配置私庫地址咽弦,從公司的私庫中去下載。

一切完成之后胁出,我們就可以正式實踐去開發(fā)屬于自己的第一個自定義函數(shù)了型型。

三、實踐開發(fā)

這里給出一個官方的參考例子全蝶,原理都很好理解闹蒜。

我們先在src/main/java目錄下的cn.lpwanger.neo4jFuns創(chuàng)建一個類,命名為Join抑淫,具體代碼如下:

import org.neo4j.procedure.Name;

import org.neo4j.procedure.Procedure;

import org.neo4j.procedure.UserFunction;

public class Join

{

@UserFunction

@Description("cn.lpwanger.neo4jFuns.join(['s1','s2',...],delimiter) - join the given strings with the given delimiter.")

public String join(

@Name("strings")List strings,

@Name(value = "delimiter",defaultValue = ",") String delimiter) {

if (strings == null || delimiter == null) {

return null;

}

return String.join(delimiter, strings);

}

}

注釋理解:

@UserFunction嫂用,它缺失的函數(shù)名是package-name.functionName,例如cn.lpwanger.neo4jFuns.join丈冬,當然也可以通過name參數(shù)去修改函數(shù)名,如@UserFunction(

name = "package.function" )甘畅。

@Description是函數(shù)的功能描述說明埂蕊,它的內(nèi)容會在Neo4j瀏覽器中調(diào)用dbms.functions()時顯示。疏唾。

@Name("strings")

List<String> strings是函數(shù)的參數(shù)說明蓄氧。

@Procedure( name =

"customers.create", mode = Mode.WRITE ),它屬于用戶自定義的過程槐脏,mode的值代表執(zhí)行模式喉童,更多的含義如下所屬:

? Mode.READ –對圖執(zhí)行只讀操作

? Mode.WRITE - 對圖執(zhí)行讀寫操作

? Mode.SCHEMA –操作數(shù)據(jù)庫模式,例如創(chuàng)建索引顿天、限制等

? Mode.DBMS –系統(tǒng)操作堂氯,但是不包括圖操作

? Mode.DEFAULT –缺省是Mode.READ

該函數(shù)的目的在于通過指定的分隔符去拼接列表中的所有字符串元素,就比如['a','b']最終返回'a,b'值牌废。

完成這一步之后咽白,在正式生成.jar文件之前,建議大家都去做一個單元測試鸟缕,這是一個良好的開發(fā)習慣晶框。

因此排抬,我們繼續(xù)在src/test/java目錄下的cn.lpwanger.neo4jFuns創(chuàng)建一個測試類:JoinTest,具體代碼如下:

import org.junit.Rule;

import org.junit.Test;

import org.neo4j.driver.v1.*;

import org.neo4j.harness.junit.Neo4jRule;


import staticorg.hamcrest.core.IsEqual.equalTo;

import static org.junit.Assert.assertThat;


public class JoinTest

{

@Rule

public Neo4jRule neo4j = new Neo4jRule()

.withFunction( Join.class );


@Test public voidshouldAllowIndexingAndFindingANode() throws Throwable { try( Driver driver =GraphDatabase.driver( neo4j.boltURI() , Config.build().withEncryptionLevel(Config.EncryptionLevel.NONE ).toConfig() ) ) { Session session =driver.session(); String result = session.run( "RETURNexample.join(['Hello', 'World']) ASresult").single().get("result").asString(); assertThat( result,equalTo( "Hello,World" ) ); } }


}


最后右鍵JoinTest.java類授段,通過Run As點擊JUnit Test去運行蹲蒲,如果assertThat結(jié)果輸出為True就測試通過。


最后侵贵,你就可以生成neo4jFuns.jar包届搁,放置于neo4j的plugins目錄下,重新啟動neo4j服務(wù)即可生效模燥,執(zhí)行下面的命令可以驗證:


WITH ['a','b'] as value RETURNcn.lpwanger.neo4jFuns.join(value);


結(jié)果輸出:"a,b"咖祭,那就說明添加成功。


以后你也可以結(jié)合實際的業(yè)務(wù)需求去開發(fā)更多的自定義函數(shù)蔫骂,提高Cypher語言處理圖數(shù)據(jù)庫的便捷性么翰。


四、參考文獻


[1] 6.2. User-defined functions - Chapter6. Extending Neo4j

[2] 6.1. Procedures - Chapter 6. ExtendingNeo4j

[3] User Defined Procedures and Functions -Neo4j Grap...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辽旋,一起剝皮案震驚了整個濱河市浩嫌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌补胚,老刑警劉巖码耐,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異溶其,居然都是意外死亡骚腥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門瓶逃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來束铭,“玉大人,你說我怎么就攤上這事厢绝∑跄” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵昔汉,是天一觀的道長懈万。 經(jīng)常有香客問我,道長靶病,這世上最難降的妖魔是什么会通? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮娄周,結(jié)果婚禮上渴语,老公的妹妹穿的比我還像新娘。我一直安慰自己昆咽,他們只是感情好驾凶,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布牙甫。 她就那樣靜靜地躺著,像睡著了一般调违。 火紅的嫁衣襯著肌膚如雪窟哺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天技肩,我揣著相機與錄音且轨,去河邊找鬼。 笑死虚婿,一個胖子當著我的面吹牛旋奢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播然痊,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼至朗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了剧浸?” 一聲冷哼從身側(cè)響起锹引,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎唆香,沒想到半個月后嫌变,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡躬它,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年腾啥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冯吓。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡倘待,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出桑谍,到底是詐尸還是另有隱情,我是刑警寧澤祸挪,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布锣披,位于F島的核電站,受9級特大地震影響贿条,放射性物質(zhì)發(fā)生泄漏雹仿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一整以、第九天 我趴在偏房一處隱蔽的房頂上張望胧辽。 院中可真熱鬧,春花似錦公黑、人聲如沸邑商。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽人断。三九已至吭从,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恶迈,已是汗流浹背涩金。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留暇仲,地道東北人步做。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像奈附,于是被迫代替她去往敵國和親全度。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

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