原文:The World’s Most Amazing Python Driver for Neo4j
作者:Nigel Small
譯者:仲培藝堂竟,關(guān)注數(shù)據(jù)庫領(lǐng)域盒发,糾錯缴挖、尋求報道或者投稿請致郵:zhongpy@csdn.net亲桦。
盡管Neo4j社區(qū)目前已發(fā)布了Java殉摔、Python、JavaScript和.NET官方支持的驅(qū)動程序配阵,但其發(fā)展并未停步馏颂。本周,Neo4j發(fā)布驅(qū)動程序py2neo3.1版本棋傍,同時還為Python用戶推出了全新的OGM救拉。
OGM(Object-Graph Mapper)和圖形數(shù)據(jù)庫的關(guān)系,就相當(dāng)于ORM(對象關(guān)系映射)和傳統(tǒng)RDMS之間的關(guān)系:前者都是一個架構(gòu)瘫拣,可供構(gòu)建database-aware領(lǐng)域?qū)ο螅╠omain objects)亿絮。
Py2neo OGM的操作圍繞新的GraphObject類展開。此處其扮演基礎(chǔ)類和管理者的雙重角色:前者限定了領(lǐng)域?qū)ο篝镏簦缓笳邉t支持基礎(chǔ)節(jié)點和使py2neo OGM持久化的相關(guān)平臺派昧。
借Movie Graph(和Neo4j預(yù)先打包)為例,以該數(shù)據(jù)集為基礎(chǔ)拢切,模擬一個Person類:
classPerson(GraphObject):
__primarykey__ = "name"
name =Property()born =Property()
此處蒂萎,一個Person類有兩類屬性。而Neo4j的屬性沒有固定類型淮椰,因此五慈,比起典型ORM下的SQL字段,其相關(guān)定義較少主穗。
類屬性和基礎(chǔ)屬性名稱相同:命名和生成泻拦。必要時,其可重定向為不同名屬性忽媒,含表達式例如Property(name="actual_name")争拐。
最終,定義一個主鍵(primarykey)晦雨,指出哪種屬性是push和pull操作的唯一標(biāo)識符架曹;定義一個primarylabel,盡管是默認(rèn)條件闹瞧,仍可用Person代替音瓷。
綜上所述,可以通過一個Cypherstatement夹抗,挑選出一個特定Person對象節(jié)點:
MATCH (a:Person) WHEREa.name = {n}RETURNa
此外绳慎,如果想要在同一個數(shù)據(jù)集內(nèi),模擬Person和Movie漠烧,還有其關(guān)聯(lián)平臺杏愤,可通過以下途徑:
classMovie(GraphObject):? ? __primarykey__ ="title"title =Property()? ? tagline =Property()? ? released =Property()? ? actors = RelatedFrom("Person","ACTED_IN")? ? directors = RelatedFrom("Person","DIRECTED")? ? producers = RelatedFrom("Person","PRODUCED")classPerson(GraphObject):? ? __primarykey__ ="name"name =Property()? ? born =Property()? ? acted_in = RelatedTo(Movie)? ? directed = RelatedTo(Movie)? ? produced = RelatedTo(Movie)
此處包含兩類新屬性:RelatedTo和RelatedFrom。這兩類屬性定義了關(guān)系對象集(連接方式相似)已脓。換句話說珊楼,就是它們共享相同的開始節(jié)點或終止節(jié)點,和共同的關(guān)系類型度液。
以acted_in = RelatedTo(Movie)為例厕宗,它描述了一組Movie關(guān)系節(jié)點集画舌,這些節(jié)點都是通過一個輸出ACTED_IN關(guān)系來連接的。這里要注意的是已慢,和上面提及的屬性命名一樣曲聂,關(guān)系類型也默認(rèn)自動匹配屬性名,只不過此處字母為大寫形式佑惠。相反朋腋,對應(yīng)的反向定義,actors = RelatedFrom("Person", "ACTED_IN")則明指定了關(guān)系名膜楷,以區(qū)分與屬性名的差異旭咽。
為了研究執(zhí)行對象的方法,可以假設(shè)一個情境:需要從數(shù)據(jù)庫中提取出Keanu Reeves赌厅,并將他和經(jīng)典影片Bill & Ted’s Excellent Adventure相連接 (不包含在原始圖當(dāng)中)穷绵。在這種情況下,首先要利用GraphObject類特愿,并通過Person子類選擇演員请垛。隨后,構(gòu)建一個新的Movie對象洽议,并添加到Keanu Reeves參與演出的影片集當(dāng)中宗收。最終,將上述全部信息匯入圖表中亚兄。進程代碼如下:
keanu= Person.select(graph,"Keanu Reeves").first()bill_and_ted = Movie()bill_and_ted.title="Bill & Ted's Excellent Adventure"keanu.acted_in.add(bill_and_ted)graph.push(keanu)
通過一個類似集的端口(提供添加和移除方法)混稽,關(guān)系對象支持其父類對象。這些數(shù)據(jù)匯入圖表之后审胚,為了完成操作匈勋,OGM架構(gòu)自動構(gòu)建并運行所有必要的Cypher。
該方法也可用于執(zhí)行其它更復(fù)雜的選擇膳叨。Where
method可利用所有WHERE
子句中的expression洽洁。比如要輸出所有名字首字母是“K”的演員,操作如下:
forpersoninPerson.select(graph).where("_.name =~ 'K.*'"):print(person.name)
注意:此處用到下劃線字符來指代待匹配節(jié)點菲嘴。
Py2neo文檔還包含很多其它信息饿自,且GitHub知識庫當(dāng)中還有一個演示應(yīng)用程序,該程序展示了一個微型movie瀏覽器(截圖如下)當(dāng)中龄坪,一切是如何運行的昭雌。
2016年8月12日-13日,由CSDN重磅打造的互聯(lián)網(wǎng)應(yīng)用架構(gòu)實戰(zhàn)峰會健田、運維技術(shù)與實戰(zhàn)峰會將在成都舉行烛卧,目前18位講師和議題已全部確認(rèn)。兩場峰會大牛講師來自阿里妓局、騰訊总放、百度呈宇、京東、小米局雄、樂視甥啄、聚美優(yōu)品、YY哎榴、華為型豁、360等知名互聯(lián)網(wǎng)公司僵蛛,共同探討高可用/高并發(fā)/高性能系統(tǒng)架構(gòu)設(shè)計尚蝌、電商架構(gòu)、分布式架構(gòu)充尉、運維工具研發(fā)與實踐飘言、運維自動化系統(tǒng)的構(gòu)建、大數(shù)據(jù)與運維驼侠、云上的運維案例分析姿鸿、虛擬化技術(shù)、應(yīng)用性能檢測與管理倒源、游戲行業(yè)的運維實踐等苛预,將和與會嘉賓共同探討「構(gòu)建更安全、更高性能笋熬、更穩(wěn)定的架構(gòu)和運維體系」等領(lǐng)域的話題與技術(shù)热某。【目前限時6折胳螟,點擊這里搶票】
7月15日24點前仍處于最低六折優(yōu)惠票價階段昔馋,單場峰會(含餐)門票只需499元,5人以上團購或者購買兩場峰會通票更有特惠糖耸,限時折扣秘遏,預(yù)購從速。(票務(wù)詳情鏈接)嘉竟。