婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > python使用py2neo查詢Neo4j的節點、關系及路徑

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

熱門標簽:外呼并發線路 長沙高頻外呼系統原理是什么 地圖標注審核表 湛江智能外呼系統廠家 ai電銷機器人源碼 ai電話機器人哪里好 百度地圖標注沒有了 宿遷星美防封電銷卡 西藏房產智能外呼系統要多少錢

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

一、連接Neo4j數據庫

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

import numpy as np
import pandas as pd
from py2neo import Node,Relationship,Graph,Path,Subgraph
from 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兩個屬性。

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

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

>>>graph.schema.node_labels 
frozenset({'Location', 'Person', 'Teacher'})
>>>graph.schema.relationship_types
frozenset({'到訪', '包含', '同事', '學生', '老師', '鄰居'})


三、使用NodeMatcher查詢節點

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

>>>node_matcher = NodeMatcher(graph)
>>>node = node_matcher.match("Person").where(age=20).first()
>>>node
Node('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()
>>>node
Node('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

例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

例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使用Py2neo創建Neo4j的節點與關系
  • Python使用py2neo操作圖數據庫neo4j的方法詳解
  • python利用文件讀寫編寫一個博客
  • 手把手帶你用python爬取小姐姐私房照
  • Python time.time()方法
  • Python接口自動化之接口依賴
  • python中bottle使用實例代碼

標簽:海南 盤錦 普洱 南平 寧夏 林芝 大同 漯河

巨人網絡通訊聲明:本文標題《python使用py2neo查詢Neo4j的節點、關系及路徑》,本文關鍵詞  python,使用,py2neo,查詢,Neo4j,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《python使用py2neo查詢Neo4j的節點、關系及路徑》相關的同類信息!
  • 本頁收集關于python使用py2neo查詢Neo4j的節點、關系及路徑的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    黑人精品欧美一区二区蜜桃| 国产精品无遮挡| 26uuu另类欧美| 亚洲欧美日韩一区二区| 青青草伊人久久| 色综合久久久网| 精品三级av在线| 亚洲成人精品影院| 91浏览器在线视频| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 久久久精品免费观看| 一区二区日韩电影| 成人性视频免费网站| 欧美一级日韩免费不卡| 亚洲视频图片小说| 不卡的电影网站| 国产亚洲女人久久久久毛片| 日本成人在线网站| 9191久久久久久久久久久| 亚洲精品乱码久久久久| 99久久夜色精品国产网站| 久久精品免视看| 国产成人8x视频一区二区| 中文字幕免费一区| 国产日韩欧美精品综合| 99视频精品在线| 日韩精品亚洲专区| 亚洲一区中文在线| 欧美日韩国产不卡| 福利视频网站一区二区三区| 亚洲一区二区三区四区五区中文 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产精品伦一区二区三级视频| 老司机精品视频在线| 911国产精品| 天堂av在线一区| 欧美一区午夜精品| 精品综合久久久久久8888| 精品国产凹凸成av人网站| 美女视频第一区二区三区免费观看网站| 欧美日韩中文字幕一区| 视频一区欧美精品| 欧美精品一区二区在线观看| 久久99国产精品久久| 精品久久久久一区二区国产| 久久99久久99| 日本一区二区三区免费乱视频| 成人精品国产免费网站| 中文字幕在线不卡视频| 日本韩国精品在线| 日韩黄色免费电影| 久久久精品免费免费| 99v久久综合狠狠综合久久| 一区二区三区四区亚洲| 欧美一区二区三区男人的天堂| 裸体歌舞表演一区二区| 久久久亚洲欧洲日产国码αv| 国产成人av资源| 亚洲小说欧美激情另类| 日韩欧美一区在线观看| 大胆欧美人体老妇| 亚洲一区二区三区中文字幕 | 国产精品动漫网站| 欧美午夜片在线看| 国产黑丝在线一区二区三区| 亚洲人成网站色在线观看| 中文字幕在线不卡一区| 五月天婷婷综合| 日本午夜精品视频在线观看| 国产精品一二三四| 欧美日产国产精品| 欧美日韩一二三区| 精品成人a区在线观看| 国产精品婷婷午夜在线观看| 亚洲最新视频在线播放| 99视频精品全部免费在线| 另类小说综合欧美亚洲| 91福利国产成人精品照片| 青娱乐精品在线视频| 亚洲欧洲精品一区二区三区不卡| 在线播放亚洲一区| 97久久精品人人做人人爽50路| 免播放器亚洲一区| 性做久久久久久久免费看| 日本一区二区免费在线| 欧美一区二区三区四区久久| 99久久er热在这里只有精品15| 免费在线观看一区二区三区| 亚洲色图在线看| 久久久久久久久久久久电影| 欧美亚洲一区三区| a美女胸又www黄视频久久| 狠狠久久亚洲欧美| 麻豆国产一区二区| 香蕉av福利精品导航| 亚洲色图欧美偷拍| 国产精品美女久久福利网站| 精品国产乱码久久久久久1区2区| 欧美精品久久久久久久久老牛影院| 99精品视频在线免费观看| 国产成人综合网站| 国产成a人亚洲精品| 国产美女娇喘av呻吟久久| 免费成人av在线| 奇米精品一区二区三区在线观看一| 一区二区三区国产| 一区二区三区四区五区视频在线观看| 欧美激情综合在线| 国产精品久久久久影院色老大| 久久久不卡网国产精品一区| 精品噜噜噜噜久久久久久久久试看| 欧美日韩视频专区在线播放| 欧美午夜精品一区二区三区| 99re热视频这里只精品| 99久久精品国产一区| 91在线观看美女| 日本道免费精品一区二区三区| 9i在线看片成人免费| 99久久免费视频.com| 91欧美一区二区| 色婷婷激情一区二区三区| 91久久国产最好的精华液| 一本久久a久久免费精品不卡| 91免费视频网| 欧美精品三级在线观看| 亚洲免费观看高清完整| 欧美一级xxx| 亚洲一区二区三区国产| 亚洲女厕所小便bbb| 国产欧美va欧美不卡在线| 欧美男同性恋视频网站| 91美女在线观看| 成人黄色免费短视频| 免费看欧美女人艹b| 一区二区三区精品视频在线| 国产精品美女一区二区在线观看| 日本一区二区视频在线| 激情综合色播激情啊| 亚洲成av人综合在线观看| 另类中文字幕网| 99亚偷拍自图区亚洲| 欧美久久久久久久久| 久久久九九九九| 亚洲人成网站在线| 美女视频黄 久久| 9i在线看片成人免费| 欧美二区三区91| 亚洲视频一区二区在线| 日本少妇一区二区| 91蜜桃视频在线| 精品成人在线观看| 亚洲午夜免费福利视频| 国产美女久久久久| 欧美性生交片4| 中文字幕不卡的av| 免费在线观看视频一区| 91热门视频在线观看| 日韩免费看的电影| 亚洲欧美另类小说视频| 蜜臀久久99精品久久久画质超高清| 成人av午夜影院| 欧美一区二区三区视频免费 | 欧美高清在线视频| 日本午夜一本久久久综合| 91网站在线观看视频| 精品成人一区二区三区四区| 亚洲国产视频一区二区| 成人免费观看视频| 精品处破学生在线二十三| 婷婷综合另类小说色区| 91在线你懂得| 国产欧美日韩麻豆91| 精品一区二区三区在线播放视频| 欧美日韩一区不卡| 日韩美女啊v在线免费观看| 高清在线观看日韩| 2023国产一二三区日本精品2022| 亚洲国产综合视频在线观看| 成人黄色av网站在线| 久久先锋资源网| 国产综合色在线视频区| 日韩一级完整毛片| 日韩电影免费在线看| 91精品福利在线| 亚洲欧美另类久久久精品| 日韩精品一区二区三区蜜臀| 精品国产乱码久久久久久1区2区| 亚洲少妇30p| 99re热这里只有精品免费视频| 日韩欧美在线123| 日韩**一区毛片| 欧美私模裸体表演在线观看| 亚洲日本一区二区三区| 懂色中文一区二区在线播放| 久久久久久久久99精品| 国产剧情在线观看一区二区| 欧美一区二区视频观看视频| 日本不卡的三区四区五区| 91精品国产乱| 美国毛片一区二区三区|