日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

python使用py2neo查詢Neo4j的節點、關系及路徑

瀏覽:28日期:2022-08-06 15:59:33

python使用py2neo查詢Neo4j的節點、關系及路徑

Neo4j是一款開源圖數據庫,Py2neo提供了使用Python語言訪問Neo4j的接口。本文介紹了使用Py2neo的NodeMatcher和RelationshipMatcher查詢圖中的節點和關系,以及通過執行Cypher語句的查詢方式。​本文使用的Py2neo是2021.1之后的版本,手冊請戳這里:The Py2neo Handbook

一、連接Neo4j數據庫

本文中會用到多種數據類型,在此一并引用

<import numpy as npimport pandas as pdfrom py2neo import Node,Relationship,Graph,Path,Subgraphfrom py2neo import NodeMatcher,RelationshipMatcher

配置Neo4j數據庫的訪問地址、用戶名和密碼:

neo4j_url = ’訪問地址’user = ’用戶名’pwd = ’密碼’

在此時間段之前訪問數據庫的方式為:

graph = Graph(neo4j_url, username=user, password=pwd)

在此時間段之后的版本訪問數據庫的方式為(就是這么不兼容):

graph = Graph(neo4j_url, auth=(user, pwd))

以下圖為例:

圖中包含一些Person節點,每個Person節點有name、age、work屬性; 其中“趙趙”節點是多label的節點,除了有Person標簽,它還有Teacher標簽; Person和Person節點之間有同事、鄰居、學生、老師等關系; 圖中還有一些Location節點,它們之間有包含關系; Person節點和Location節點之間有“到訪”關系,“到訪”關系具有date和stay_hours兩個屬性。

python使用py2neo查詢Neo4j的節點、關系及路徑

二、 通過graph.schema查詢圖中節點和關系有哪些類型

查看節點的類型用graph.schema.node_labels,查看關系的類型用graph.schema.relationship_types,它們的返回值類型都是frozenset,是不能增刪元素的集合。

>>>graph.schema.node_labels frozenset({’Location’, ’Person’, ’Teacher’})>>>graph.schema.relationship_typesfrozenset({’到訪’, ’包含’, ’同事’, ’學生’, ’老師’, ’鄰居’})三、使用NodeMatcher查詢節點

首先創建一個NodeMatcher對象,用match來指明要匹配哪種label的節點,用where來表示篩選條件(有兩種方法)。需要注意的是,匹配成功返回的是NodeMatcher的對象,要轉化成Node對象,可以用first取出符合條件的第一個節點,或者轉化成節點的list。

>>>node_matcher = NodeMatcher(graph)>>>node = node_matcher.match('Person').where(age=20).first()>>>nodeNode(’Person’, age=20, name=’李李’, work=’好吧啦網’)>>>nodes = list(node_matcher.match('Person').where(age=35))>>>nodes[Node(’Person’, age=35, name=’王王’, work=’好吧啦網’)]

where條件有兩種寫法,一種是把要匹配的屬性和值寫成key=value的形式,例如上面的where(age=20),這種寫法只能按照值是否完全一致來匹配,不能按照值的大小來篩選,如果寫成下面這樣是會報錯的:

node = node_matcher.match('Person').where(age>20).first() # 錯誤想要按照值的大小篩選或者做一些字符串的模糊匹配,可以把條件表達式寫成一個字符串,整體放在where語句中,在這個字符串中,可以用 _ 來代指匹配到的節點。下面兩個例子,第一個是匹配work屬性為“月亮XX”模式的Person節點,另一個是匹配age大于20的Person節點。

>>>node = node_matcher.match('Person').where('_.work =~ ’月亮.*’').first()>>>nodeNode(’Person’, ’Teacher’, age=45, name=’趙趙’, work=’月亮中學’)>>>nodes = list(node_matcher.match('Person').where('_.age > 20'))>>>nodes[Node(’Person’, age=35, name=’王王’, work=’好吧啦網’), Node(’Person’, age=30, name=’張張’, work=’好吧啦網’), Node(’Person’, ’Teacher’, age=45, name=’趙趙’, work=’月亮中學’)]

將NodeMatcher返回的結果轉化為Node數據類型或者Node的list之后,訪問其中的屬性也就十分簡單了,如上面最后一例的結果,訪問其中第一個節點的name屬性:

>>>nodes[0][’name’]’王王’四、 使用RelationshipMatcher查詢關系

RelationshipMatcher的match方法有三個及以上參數:

第一個參數是節點的序列或者set,可以為None,為None表示任意節點均可; 第二個參數是關系的類型,可以為None,為None表示任意類型的關系均可; 第三個參數開始是要匹配的屬性,寫成key=value的形式。

match方法的返回值是RelationshipMatcher類型,需要通過first轉化成Relationship數據結構,或者轉化為list。

舉例說明

列1:比如想要查詢“李李”節點的所有關系。先查詢出節點,再查詢節點的關系,r_type=None表示任意類型的關系均可。返回的關系包括到訪、同事。

>>>node1 = node_matcher.match('Person').where(name=’李李’).first()>>>relationship = list(relationship_matcher.match([node1], r_type=None))>>>relationship[到訪(Node(’Person’, age=20, name=’李李’, work=’好吧啦網’), Node(’Location’, name=’祿口機場’), date=’2021/7/16’, stay_hours=1), 同事(Node(’Person’, age=20, name=’李李’, work=’好吧啦網’), Node(’Person’, age=30, name=’張張’, work=’好吧啦網’)), 同事(Node(’Person’, age=20, name=’李李’, work=’好吧啦網’), Node(’Person’, age=35, name=’王王’, work=’好吧啦網’))]

例2:查詢“李李”和“張張”的關系,兩個節點的順序表示了要匹配的關系的方向。所以在整個圖中“李李”和“張張”節點之間的同事關系是雙向的,但是查詢結果只給出了從“張張”節點到“李李”節點的一條關系。

>>>node1 = node_matcher.match('Person').where(name=’李李’).first()>>>node2 = node_matcher.match('Person').where(name=’張張’).first()>>>relationship = list(relationship_matcher.match((node2,node1), r_type=None))>>>relationship[同事(Node(’Person’, age=30, name=’張張’, work=’好吧啦網’), Node(’Person’, age=20, name=’李李’, work=’好吧啦網’))]

例3:詢圖中某一類關系,第一個參數為None,第二個參數r_type指定關系類型,這里查詢了圖中所有的同事關系。

>>>relationship = list(relationship_matcher.match(None, r_type=’同事’))>>>relationship[同事(Node(’Person’, age=20, name=’李李’, work=’好吧啦網’), Node(’Person’, age=30, name=’張張’, work=’好吧啦網’)), 同事(Node(’Person’, age=20, name=’李李’, work=’好吧啦網’), Node(’Person’, age=35, name=’王王’, work=’好吧啦網’)), 同事(Node(’Person’, age=35, name=’王王’, work=’好吧啦網’), Node(’Person’, age=20, name=’李李’, work=’好吧啦網’)), 同事(Node(’Person’, age=30, name=’張張’, work=’好吧啦網’), Node(’Person’, age=20, name=’李李’, work=’好吧啦網’))]

例4: 在查詢關系時按照屬性的值篩選,可以將該屬性寫為key=value的形式作為match方法的第三個參數。這里,查詢圖中的到訪關系,并且stay_hours屬性為1。

>>>relationship = list(relationship_matcher.match(None, r_type=’到訪’, stay_hours=1))>>>relationship[到訪(Node(’Person’, age=20, name=’李李’, work=’好吧啦網’), Node(’Location’, name=’祿口機場’), date=’2021/8/24’, stay_hours=1)]

雖然Py2neo的手冊上沒有寫,但其實RelationshipMatcher也可以接上where方法,按照屬性的值篩選關系。上面這個例子也可以寫作下面這種形式,效果是一樣的。

relationship = list(relationship_matcher.match(None, r_type=’到訪’).where(stay_hours=1))同樣,在where方法中也可以寫一個字符串表達式,實現按值大小來篩選關系。例如要篩選出所有到訪關系,且stay_hours>=1的關系時,可以這樣寫:

>>>relationship = list(relationship_matcher.match(None, r_type=’到訪’).where('_.stay_hours>=1'))>>>relationship[到訪(Node(’Person’, age=20, name=’李李’, work=’好吧啦網’), Node(’Location’, name=’祿口機場’), date=’2021/8/24’, stay_hours=1), 到訪(Node(’Person’, age=20, name=’劉劉’, work=’地球電子商務公司’), Node(’Location’, name=’祿口機場’), date=’2021/8/24’, stay_hours=4)]

如何訪問返回的結果中的各個屬性呢,Relationship其實是包含了一對起止節點:start_nodeend_node,包含了關系的類型,而關系的屬性是以字典形式存在的,可以用get方法來獲取屬性的值。獲取關系的起止節點:

>>>print(relationship[0].start_node[’name’])>>>print(relationship[0].end_node[’name’])李李祿口機場

獲取關系的類型的文本字符串

>>>print(relationship[0])>>>print(type(relationship[0]).__name__)(李李)-[:到訪 {date: ’2021/8/24’, stay_hours: 1}]->(祿口機場)到訪

獲取關系中的屬性和值

>>>print(relationship[0].keys())>>>print(relationship[0].values())>>>print(relationship[0].get(’date’))dict_keys([’date’, ’stay_hours’])dict_values([’2021/8/24’, 1])2021/8/24五、通過執行Cypher語句查詢

NodeMatcher和RelationshipMatcher能夠表達的匹配條件相對簡單,更加復雜的查詢還是需要用Cypher語句來表達。Py2neo本身支持執行Cypher語句的執行,可以將復雜的查詢寫成Cypher語句,通過graph.run方法查詢,返回的結果可以轉化為pandas.DataFrame或者pandas.Series對象,從而和其他數據分析工具無縫銜接。

例如:要查詢Person節點,并滿足work屬性為“好吧啦網”。Cypher語句中可以使用WHERE接條件表達式,使用AS將返回的屬性改名,返回多個屬性時,用xxx AS x, yyy AS y。graph.run方法之后再接to_data_frame()可以將返回的數據變成pandas的DataFrame對象,并且用AS改過的屬性名即為DataFrame中的列名。

cypher_ = 'MATCH (n:Person) WHERE n.work=’好吧啦網’ RETURN n.name AS name, n.age AS age 'df = graph.run(cypher_).to_data_frame() # pd.DataFrame

python使用py2neo查詢Neo4j的節點、關系及路徑

例2:查詢一個已知節點和其他哪些節點有關系,有什么樣的關系。Cypher語言查詢關系時用 < 或者 > 表示方向,這里需要返回type(r),直接返回r的話結果里是空值。

>>>cypher_ = 'MATCH (n:Person)-[r]->(m:Person) WHERE n.name=’李李’ RETURN type(r) AS type,m.name AS name'>>>df = graph.run(cypher_).to_data_frame() # pd.DataFrame

python使用py2neo查詢Neo4j的節點、關系及路徑

例3:Cypher語言還可以查詢路徑,因為不確定返回的路徑數量,所以最好先將結果轉化為pandas.Series,再遍歷訪問其中每條路徑的節點和關系。這里查詢的是“趙趙”節點和“王王”節點之間的關系路徑,關系指定為同事或鄰居,關系不超過4層。

>>>cypher_ = 'MATCH path=(m:Person)-[:同事|鄰居*1..4]->(n:Person) WHERE m.name=’趙趙’ AND n.name=’王王’ RETURN path'>>>s = graph.run(cypher_).to_series()>>>print(len(s))>>>s[0]Path(Node(’Person’, ’Teacher’, age=45, name=’趙趙’, work=’月亮中學’),鄰居(Node(’Person’, ’Teacher’, age=45, name=’趙趙’, work=’月亮中學’), Node(’Person’, age=30, name=’張張’, work=’好吧啦網’)), 同事(Node(’Person’, age=30, name=’張張’, work=’好吧啦網’), Node(’Person’, age=20, name=’李李’, work=’好吧啦網’)), 同事(Node(’Person’, age=20, name=’李李’, work=’好吧啦網’), Node(’Person’, age=35, name=’王王’, work=’好吧啦網’)))

這里查詢到的關系路徑數量僅有1條。從上圖的結果中也可以看出來,Path是一個比較復雜的結構,Path中的節點和關系分別用nodes和relationships表示,并且是按照路徑上節點和關系的順序分別存放的。這里給出一段示例代碼,對每一個路徑都做了直接打印path數據結構和自己組織路徑文本。

for path in s: # 直接打印path print(path) # 獲取路徑中的節點和關系 nodes = path.nodes relationshis = path.relationships # 自己組織路徑文本 path_text = '' for n,r in zip(nodes, relationshis):# 每次加入一個節點和一個關系的類型path_text += '{} - {} - '.format(n[’name’], type(r).__name__) # 別忘了最后一個節點 path_text += nodes[-1][’name’] + ’n’ print(path_text)

運行這段代碼得的結果如下所示,上面一行是直接打印路徑的結果,下面一行是自己組織文本得到的結果。

(趙趙)-[:鄰居 {}]->(張張)-[:同事 {}]->(李李)-[:同事 {}]->(王王)趙趙 - 鄰居 - 張張 - 同事 - 李李 - 同事 - 王王

使用Py2neo查詢Neo4j中的節點、關系和路徑時,條件簡單的查詢可以通NodeMatcher和RelationshipMatcher來實現。而較為復雜的查詢,可以寫成Cypher語句來查詢,查詢結果可以轉化為pandas的DataFrame或者Series數據類型,與其他數據分析工具結合

以上就是python使用py2neo查詢Neo4j的節點、關系及路徑的詳細內容,更多關于python py2neo的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品一区二区三区四区在线观看 | 麻豆国产精品视频| 久久高清国产| 老鸭窝毛片一区二区三区| 国产视频一区三区| 麻豆亚洲精品| 国产精品腿扒开做爽爽爽挤奶网站| 夜夜精品视频| 亚洲一区黄色| 中文字幕一区二区av| 中文一区一区三区免费在线观| 免费观看久久av| 国产精品呻吟| 亚洲精品大片| 欧美在线精品一区| 国产精区一区二区| 精品视频一二| 欧美日韩一二| 丝袜亚洲精品中文字幕一区| 亚洲精品高潮| 国产精品视频一区二区三区综合 | 日本亚洲不卡| 国产精品亚洲人成在99www| 国产一区二区三区四区| 日韩精品91| 一区二区视频欧美| 日韩精品亚洲专区在线观看| 国产日韩中文在线中文字幕| 精品伊人久久| 日韩久久视频| 午夜在线精品| 国产精品资源| 青青久久av| 首页欧美精品中文字幕| 91亚洲精品在看在线观看高清| 麻豆久久一区二区| 久久免费高清| 天堂精品久久久久| 免费看久久久| 国内精品福利| 日韩国产成人精品| 色欧美自拍视频| 午夜一级在线看亚洲| 国产欧美69| 国产精品久久久久av电视剧| 午夜在线精品偷拍| 精品视频99| 欧美日韩国产欧| 久久av日韩| 日韩视频二区| 精品国产亚洲一区二区三区大结局| 亚洲电影在线一区二区三区| 日韩不卡免费视频| 久久久9色精品国产一区二区三区| 亚洲网址在线观看| а√在线中文在线新版| 蜜臀91精品一区二区三区| 精品一区不卡| 免费在线欧美视频| 免费在线日韩av| 快she精品国产999| 国产色播av在线| 日韩精品国产精品| 99久久久久久中文字幕一区| 久久精品72免费观看| 久久婷婷激情| 国产午夜久久av| 夜夜嗨av一区二区三区网站四季av| 美女国产精品久久久| 久久最新视频| 日韩一区欧美| 国产毛片精品| 免费国产亚洲视频| 日韩专区精品| 亚洲精品国产精品粉嫩| 亚洲成av在线| 麻豆91精品视频| 日韩中文av| 日韩视频久久| 久久久一本精品| 国产精区一区二区| 香蕉成人久久| 日韩精品一区二区三区免费观看| 国产欧美亚洲精品a| 免费看欧美美女黄的网站| 日韩免费在线| 免费视频一区二区三区在线观看 | 日韩av电影一区| 99国产精品| 婷婷综合六月| 国模精品一区| 国产另类在线| 日韩精品中文字幕吗一区二区| 999国产精品永久免费视频app| 麻豆中文一区二区| 欧美午夜网站| 日韩国产欧美视频| 中文字幕一区二区三区四区久久| 国产精品av久久久久久麻豆网| 国产一区二区三区亚洲综合| 国产精品嫩模av在线| 日本不卡的三区四区五区| 亚洲高清久久| 久久精品一区二区不卡| 天堂av在线| 国产一区二区三区精品在线观看 | 日韩精品电影| 高清一区二区| 精品视频一区二区三区在线观看| 久久国产精品色av免费看| 亚洲精品美女91| 亚洲精一区二区三区| 久久亚洲风情| 国产视频一区在线观看一区免费| 国产精品yjizz视频网| 精品三级在线观看视频| 蜜桃久久久久| 久久精品国产亚洲一区二区三区| 国产精品v亚洲精品v日韩精品| 91伊人久久| 欧美日韩1区| 国产精品密蕾丝视频下载| 国产精品久久久久久久久久妞妞| 欧美精品影院| 欧美视频久久| 国产精品蜜月aⅴ在线| 国产精品成人国产| 国产精品一区毛片| 精品中文在线| 成人午夜网址| 亚洲性色av| 999久久久91| 在线精品视频在线观看高清| 亚洲特级毛片| 亚洲一区二区免费看| 在线精品视频一区| 少妇精品久久久一区二区| 日韩一区二区三区免费视频 | 深夜福利一区| 国产日韩亚洲| 精品99久久| 欧美手机在线| 中文一区一区三区免费在线观 | 国产va免费精品观看精品视频| 电影91久久久| 欧美黄色网页| 欧美高清一区| 巨乳诱惑日韩免费av| 亚洲精品乱码久久久久久蜜桃麻豆 | 免费不卡在线视频| 99国产精品99久久久久久粉嫩| 亚洲一区有码| 国产精品一区二区av日韩在线| 成人国产精品久久| 欧美日韩第一| 午夜电影一区| 麻豆精品在线| 久久久久一区| 亚洲精品大片| 精品国产午夜| 欧美日韩高清| 日本午夜精品久久久久| 国产一区二区三区亚洲| 国产精品97| 日本不卡视频在线观看| 国产精品久一| 美女网站一区| 日韩国产91| 精品日韩视频| 日本不卡一区二区三区| 久久久亚洲欧洲日产| 色爱综合av| 综合一区二区三区| 精品欧美日韩精品| 影院欧美亚洲| 国产精品一区二区中文字幕| 久久久久久免费视频| 日本国产欧美| 国产亚洲一区二区手机在线观看 | 在线中文字幕播放| 一区二区高清| 精品国产不卡一区二区| 亚洲免费影院| 久久精品国产久精国产| 欧美午夜不卡| 国产精品白浆| 亚洲欧美高清| 国产精品国产一区| 亚洲影视一区二区三区| 久久精品一本| 久热综合在线亚洲精品| 精品久久久网| 亚洲三区欧美一区国产二区| 人在线成免费视频| 欧美一区自拍| 国产亚洲在线| 日韩一区二区三区免费播放| 欧美日韩1区2区3区| 日韩视频一区| 国产超碰精品|