在Neo4j中運(yùn)用APOC觸發(fā)器進(jìn)行推導(dǎo)關(guān)系的保存

原文鏈接:https://markhneedham.com/blog/2018/11/05/neo4j-inferred-relationships-apoc-triggers/

對圖數(shù)據(jù)庫進(jìn)行建模時费尽,我非常看中的一點是:其在進(jìn)行關(guān)系推導(dǎo)時要比其他關(guān)系型數(shù)據(jù)庫更簡單。本文我們將學(xué)習(xí)怎樣使用APOC的觸發(fā)器特性來進(jìn)行關(guān)系推導(dǎo)的計算與保存银伟。

聚會圖模型

在開始介紹之前料饥,我們先來了解一下什么是推導(dǎo)關(guān)系梧宫。首先我們先創(chuàng)建一個小型的圖模型困食,包含有Person荆残、Meetup和Topic三類節(jié)點肋层∫隗裕可使用下面語句進(jìn)行創(chuàng)建:

MERGE (mark:Person {name: "Mark"})

MERGE (neo4jMeetup:Meetup {name: "Neo4j London Meetup"})
MERGE (bigDataMeetup:Meetup {name: "Big Data Meetup"})
MERGE (dataScienceMeetup:Meetup {name: "Data Science Meetup"})

MERGE (dataScience:Topic {name: "Data Science"})
MERGE (databases:Topic {name: "Databases"})

MERGE (neo4jMeetup)-[:HAS_TOPIC]->(dataScience)
MERGE (neo4jMeetup)-[:HAS_TOPIC]->(databases)
MERGE (bigDataMeetup)-[:HAS_TOPIC]->(dataScience)
MERGE (bigDataMeetup)-[:HAS_TOPIC]->(databases)
MERGE (dataScienceMeetup)-[:HAS_TOPIC]->(dataScience)
MERGE (dataScienceMeetup)-[:HAS_TOPIC]->(databases)

MERGE (mark)-[:MEMBER_OF]->(neo4jMeetup)
MERGE (mark)-[:MEMBER_OF]->(bigDataMeetup)

在Neo4j瀏覽器看到圖的是這樣:?


尋找潛在關(guān)系

現(xiàn)在在Person和Topic節(jié)點之間是沒有關(guān)系的,換句話說栋猖,我們不知道哪個人對哪個主題有興趣净薛。然而,我們發(fā)現(xiàn)通過Meetup節(jié)點有一個間接的關(guān)系蒲拉。?

譯者言:上圖作者畫錯了肃拜,應(yīng)該把Group換成Meetup才對。

我們假設(shè)一個人參加了多次聚會雌团,其中有3次聚會都有這個主題燃领,我們就可以推斷出他對這個主題感興趣。換句話說锦援,只要某人參加了有這主題的聚會3次或3次以上猛蔽,我們就會在Person和Topic節(jié)點間建立INTERESTED_IN關(guān)系。Cypher語句如下:

MATCH (start:Person {name: "Mark"})-[:MEMBER_OF]->()-[:HAS_TOPIC]->(topic)
WHERE not((start)-[:INTERESTED_IN]->(topic))
WITH start, topic, count(*) AS count
WHERE count >= 3
MERGE (start)-[interestedIn:INTERESTED_IN]->(topic)
SET interestedIn.tentative = true

因為Mark參加帶有任一主題的聚會都不到3次灵寺,所以曼库,上面的Cypher語句并不會創(chuàng)建INTERESTED_IN關(guān)系。我們現(xiàn)在修改一下數(shù)據(jù)略板,讓Mark再參加一次Data Science聚會毁枯,修改語句如下:

MATCH (p:Person {name: "Mark"})
MATCH (meetup:Meetup {name: "Data Science Meetup"})
MERGE (p)-[:MEMBER_OF]->(meetup)

上面語句運(yùn)行后,再執(zhí)行之前的Cypher語句叮称,此時有下面的輸出:

Created 2 relationships, completed after 2 ms.

很好后众,此時我們已經(jīng)知道Mark對DataScience和Database這兩個主題都感興趣。


我們把tentative屬性設(shè)置在true颅拦,表示這是一個推導(dǎo)關(guān)系蒂誉。后續(xù)可以考慮讓用戶確認(rèn)這個關(guān)系的正確性。

觸發(fā)器

這個關(guān)系建立起來了距帅,但是過程太痛苦了右锨。每次建立一個新的MEMBER_OF關(guān)系后,就要運(yùn)行那條推導(dǎo)關(guān)系查詢的語句碌秸,這個過程能自動化就好了绍移。

別說悄窃,還真行。使用APOC庫中的觸發(fā)器就可以讓這個過程自動化蹂窖。在APOC庫中轧抗,對觸發(fā)器是這么描述的

在觸發(fā)器中注冊一段可以被調(diào)用的Cypher查詢語句,當(dāng)Neo4j中的數(shù)據(jù)發(fā)生變化時瞬测,這段Cypher語句將會在數(shù)據(jù)的提交前或提交后被運(yùn)行起來横媚。 好,接下來我們建立一個觸發(fā)器月趟,每當(dāng)一個新關(guān)系被建立時就運(yùn)行這段腳本灯蝴。代碼如下:

CALL apoc.trigger.add("interests",
"UNWIND [rel in $createdRelationships WHERE type(rel) = 'MEMBER_OF'] AS rel
WITH startNode(rel) AS start, endNode(rel) AS end
MATCH (start)-[:MEMBER_OF]->()-[:HAS_TOPIC]->(topic)
WHERE not((start)-[:INTERESTED_IN]->(topic))
WITH start, topic, count(*) AS count
WHERE count >= 3
MERGE (start)-[interestedIn:INTERESTED_IN]->(topic)
SET interestedIn.tentative = true
",
{phase:'before'})

上面這段代碼是基于這樣一個假設(shè):在每個事務(wù)中,每個Person只會創(chuàng)建一條MEMBER_OF關(guān)系孝宗。我們的觸發(fā)器將會接收到一個事務(wù)中所有創(chuàng)建關(guān)系穷躁,然后只取出MEMBER_OF關(guān)系,接著運(yùn)行我們的Cypher語句因妇,在Person和Topic之間建立INTERESTED_IN關(guān)系问潭,表示此人對這個主題感興趣。

如果你認(rèn)為參加3次這種主題的聚會太少了婚被,想改變這個閾值狡忙,僅需要改變上面查詢語句中的這行代碼就可以:

WHERE count >= 3

好,關(guān)于APOC中的觸發(fā)器先介紹到這里摔寨,希望對你有用去枷。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市是复,隨后出現(xiàn)的幾起案子删顶,更是在濱河造成了極大的恐慌,老刑警劉巖淑廊,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逗余,死亡現(xiàn)場離奇詭異,居然都是意外死亡季惩,警方通過查閱死者的電腦和手機(jī)录粱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來画拾,“玉大人啥繁,你說我怎么就攤上這事∏嗯祝” “怎么了旗闽?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我适室,道長嫡意,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任捣辆,我火速辦了婚禮蔬螟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘汽畴。我一直安慰自己旧巾,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布整袁。 她就那樣靜靜地躺著菠齿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上澜公,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天巢价,我揣著相機(jī)與錄音,去河邊找鬼几于。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的痹仙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼殉了,長吁一口氣:“原來是場噩夢啊……” “哼开仰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起薪铜,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤众弓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后隔箍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谓娃,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年蜒滩,在試婚紗的時候發(fā)現(xiàn)自己被綠了滨达。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡俯艰,死狀恐怖捡遍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情竹握,我是刑警寧澤画株,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響污秆,放射性物質(zhì)發(fā)生泄漏劈猪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一良拼、第九天 我趴在偏房一處隱蔽的房頂上張望战得。 院中可真熱鬧,春花似錦庸推、人聲如沸常侦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽聋亡。三九已至,卻和暖如春际乘,著一層夾襖步出監(jiān)牢的瞬間坡倔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工脖含, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留罪塔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓养葵,卻偏偏與公主長得像征堪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子关拒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

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