电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

python使用py2neo查詢Neo4j的節(jié)點、關(guān)系及路徑

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

python使用py2neo查詢Neo4j的節(jié)點、關(guān)系及路徑

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

一、連接Neo4j數(shù)據(jù)庫

本文中會用到多種數(shù)據(jù)類型,在此一并引用

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

配置Neo4j數(shù)據(jù)庫的訪問地址、用戶名和密碼:

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

在此時間段之前訪問數(shù)據(jù)庫的方式為:

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

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

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

以下圖為例:

圖中包含一些Person節(jié)點,每個Person節(jié)點有name、age、work屬性; 其中“趙趙”節(jié)點是多l(xiāng)abel的節(jié)點,除了有Person標(biāo)簽,它還有Teacher標(biāo)簽; Person和Person節(jié)點之間有同事、鄰居、學(xué)生、老師等關(guān)系; 圖中還有一些Location節(jié)點,它們之間有包含關(guān)系; Person節(jié)點和Location節(jié)點之間有“到訪”關(guān)系,“到訪”關(guān)系具有date和stay_hours兩個屬性。

python使用py2neo查詢Neo4j的節(jié)點、關(guān)系及路徑

二、 通過graph.schema查詢圖中節(jié)點和關(guān)系有哪些類型

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

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

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

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

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

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

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

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

>>>nodes[0][’name’]’王王’四、 使用RelationshipMatcher查詢關(guān)系

RelationshipMatcher的match方法有三個及以上參數(shù):

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

match方法的返回值是RelationshipMatcher類型,需要通過first轉(zhuǎn)化成Relationship數(shù)據(jù)結(jié)構(gòu),或者轉(zhuǎn)化為list。

舉例說明

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

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

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

>>>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=’好吧啦網(wǎng)’), Node(’Person’, age=20, name=’李李’, work=’好吧啦網(wǎng)’))]

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

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

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

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

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

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

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

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

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

獲取關(guān)系的類型的文本字符串

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

獲取關(guān)系中的屬性和值

>>>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五、通過執(zhí)行Cypher語句查詢

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

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

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

python使用py2neo查詢Neo4j的節(jié)點、關(guān)系及路徑

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

>>>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的節(jié)點、關(guān)系及路徑

例3:Cypher語言還可以查詢路徑,因為不確定返回的路徑數(shù)量,所以最好先將結(jié)果轉(zhuǎn)化為pandas.Series,再遍歷訪問其中每條路徑的節(jié)點和關(guān)系。這里查詢的是“趙趙”節(jié)點和“王王”節(jié)點之間的關(guān)系路徑,關(guān)系指定為同事或鄰居,關(guān)系不超過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=’月亮中學(xué)’),鄰居(Node(’Person’, ’Teacher’, age=45, name=’趙趙’, work=’月亮中學(xué)’), Node(’Person’, age=30, name=’張張’, work=’好吧啦網(wǎng)’)), 同事(Node(’Person’, age=30, name=’張張’, work=’好吧啦網(wǎng)’), Node(’Person’, age=20, name=’李李’, work=’好吧啦網(wǎng)’)), 同事(Node(’Person’, age=20, name=’李李’, work=’好吧啦網(wǎng)’), Node(’Person’, age=35, name=’王王’, work=’好吧啦網(wǎng)’)))

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

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

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

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

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

以上就是python使用py2neo查詢Neo4j的節(jié)點、關(guān)系及路徑的詳細(xì)內(nèi)容,更多關(guān)于python py2neo的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 加热制冷恒温循环器-加热制冷循环油浴-杭州庚雨仪器有限公司 | 热工多功能信号校验仪-热电阻热电偶校验仿真仪-金湖虹润仪表 | 搅拌磨|搅拌球磨机|循环磨|循环球磨机-无锡市少宏粉体科技有限公司 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | 小程序开发公司_APP开发多少钱_软件开发定制_微信小程序制作_客户销售管理软件-济南小溪畅流网络科技有限公司 | 大倾角皮带机-皮带输送机-螺旋输送机-矿用皮带输送机价格厂家-河南坤威机械 | 低噪声电流前置放大器-SR570电流前置放大器-深圳市嘉士达精密仪器有限公司 | 地脚螺栓_材质_标准-永年县德联地脚螺栓厂家 | 耐磨焊丝,堆焊焊丝,耐磨药芯焊丝,碳化钨焊丝-北京耐默公司 | 企业管理培训,企业培训公开课,企业内训课程,企业培训师 - 名课堂企业管理培训网 | 一路商机网-品牌招商加盟优选平台-加盟店排行榜平台 | 恒温恒湿试验箱_高低温试验箱_恒温恒湿箱-东莞市高天试验设备有限公司 | 充气膜专家-气膜馆-PTFE膜结构-ETFE膜结构-商业街膜结构-奥克金鼎 | 威客电竞(vk·game)·电子竞技赛事官网 | 磁力抛光研磨机_超声波清洗机厂家_去毛刺设备-中锐达数控 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库 | 标准光源箱|对色灯箱|色差仪|光泽度仪|涂层测厚仪_HRC大品牌生产厂家 | 低粘度纤维素|混凝土灌浆料|有机硅憎水粉|聚羧酸减水剂-南京斯泰宝 | 珠宝展柜-玻璃精品展柜-首饰珠宝展示柜定制-鸿钛展柜厂家 | 头条搜索极速版下载安装免费新版,头条搜索极速版邀请码怎么填写? - 欧远全 | 复合土工膜厂家|hdpe防渗土工膜|复合防渗土工布|玻璃纤维|双向塑料土工格栅-安徽路建新材料有限公司 | 米顿罗计量泵(科普)——韬铭机械 | ERP企业管理系统永久免费版_在线ERP系统_OA办公_云版软件官网 | 陕西华春网络科技股份有限公司 | 塑胶跑道_学校塑胶跑道_塑胶球场_运动场材料厂家_中国塑胶跑道十大生产厂家_混合型塑胶跑道_透气型塑胶跑道-广东绿晨体育设施有限公司 | 深圳APP开发公司_软件APP定制开发/外包制作-红匣子科技 | 不锈钢钢格栅板_热浸锌钢格板_镀锌钢格栅板_钢格栅盖板-格美瑞 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 桥架-槽式电缆桥架-镀锌桥架-托盘式桥架 - 上海亮族电缆桥架制造有限公司 | 通风天窗,通风气楼,屋顶通风天窗,屋顶通风天窗公司 | 量子管通环-自清洗过滤器-全自动反冲洗过滤器-北京罗伦过滤技术集团有限公司 | 天然气分析仪-液化气二甲醚分析仪|传昊仪器 | 法兰连接型电磁流量计-蒸汽孔板节流装置流量计-北京凯安达仪器仪表有限公司 | 绿叶|绿叶投资|健康产业_绿叶投资集团有限公司 | 安全阀_弹簧式安全阀_美标安全阀_工业冷冻安全阀厂家-中国·阿司米阀门有限公司 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 防勒索软件_数据防泄密_Trellix(原McAfee)核心代理商_Trellix(原Fireeye)售后-广州文智信息科技有限公司 | 空调风机,低噪声离心式通风机,不锈钢防爆风机,前倾皮带传动风机,后倾空调风机-山东捷风风机有限公司 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 兰州牛肉面加盟,兰州牛肉拉面加盟-京穆兰牛肉面 |