python使用Neo4j圖數據庫——py2neo詳解(1)

0 前言

Py2neo是一個客戶端庫和工具包,可通過Python應用程序內部和命令行使用Neo4j。該庫支持Bolt和HTTP,並提供高級API,OGM,管理工具,交互式控制檯,用於Pygments的Cypher詞法分析器以及許多其他功能。與以前的版本不同,Py2neo不需要啓用HTTP的服務器,並且可以完全通過Bolt運行。

當考慮使用py2neo還是Neo4j的官方Python驅動程序時,需要權衡取捨。Py2neo提供了更高級別的API和OGM,但是官方驅動程序提供了與集羣一起使用的機制,例如自動重試。如果您不熟悉Neo4j,需要OGM,不想立即學習Cypher或需要數據科學集成,則py2neo可能是更好的選擇。如果您正在構建高可用性企業應用程序,或者正在使用羣集,則可能需要官方驅動程序。

官方文檔

1 安裝

  • 直接使用pip install py2neo安裝
  • 使用pip install --upgrade py2neo更新到最新穩定版本
  • 使用pip install --upgrade --pre py2neo安裝最新的預發行版本
  • 支持python版本:2.7/3.5/3.6/3.7/3.8
  • 支持Neo4j版本:3.2/3.3/3.4/3.5/4.0(建議使用最新的預發行版)

2 py2neo.data

2.1 Node和Relation對象

圖模型的兩個基本構建就是Node和Relation。節點是圖形內數據存儲的基本單位。它可以包含一組鍵/值對(屬性),並且可以選擇用一個或多個文本標籤進行裝飾。關係是一對節點之間(或單個節點上的循環)之間的有類型的定向連接。跟節點一樣,關係也可以包含一組屬性。

下面的代碼顯示瞭如何創建幾個節點以及將它們連接起來的關係。每個節點都有一個屬性,名稱,並被標記爲Person。該關係ab描述了從第一節點到第二節點的KNOWS連接。ab

from py2neo.data import Node, Relation
a = Node('Person', name='Alice')
b = Node('Person', name='Bob')
ab = Relation(a, 'knows', b)
# ab (Alice)-[:knows]->(Bob)

類py2neo.data.Node(*標籤, **屬性)
使用指定的標籤和屬性構造一個新的節點對象。在其初始狀態下,節點是unbound。這意味着它僅存在於客戶端上,而不會引用相應的服務器節點。節點通常是是creating後,纔會出現在Neo4j數據庫。
常用方法:

  • node == other:如果節點node和節點other相等,則返回True。節點相等性完全基於它所代表的節點的ID。屬性和標籤都不會影響平等。這意味着,如果節點綁定到數據庫中,則進行判斷的兩個節點是否相等,取決於它們是否綁定到同一數據庫節點。如果一個節點是未綁定的,因此沒有相應的節點ID,則該節點只能等於其自身。
  • node != other:如果節點不相等,則返回True。
  • hash(node):根據節點對象的ID(如果未綁定)或它表示的數據庫節點的ID(如果綁定)返回節點的哈希值。
  • node[key]:返回節點屬性中key對應的值,如果沒有key返回None。
  • node[key] = value:將節點屬性key的值設置爲value,value可以爲None。
  • del node[key]:刪除節點key對應的屬性,如果不存在會拋出keyerror。
  • len(node):返回節點屬性的數量。
  • dict(node):返回節點的所有屬性和值,形式是字典。
  • walk(node):yield node as the only item in a walk()。
  • node.labels:返回與node關聯的完整標籤集。此集合是不可變的,不能用於添加或刪除標籤。
  • node.has_label(標籤):如果節點具有標籤label,則返回True。
  • node.add_label(標籤):將標籤添加到node。
  • node.remove_label(標籤):從節點除去標籤,如果不存在,則引發ValueError。
  • node.clear_labels():刪除節點的所有標籤。
  • node.update_labels(標籤集):從可迭代的標籤集向節點添加多個標籤。
  • node.graph:節點綁定到數據庫。
  • node.identity:如果節點綁定到數據庫,返回節點的ID。

類py2neo.data.Realtionship()
用法:
py2neo.data.Relationship(start_node,type,end_node,** 屬性)
py2neo.data.Relationship(start_node,end_node,** 屬性)
py2neo.data.Relationship(節點,類型,** 屬性)
py2neo.data.Relationship(node,** 屬性)

 c = Node("Person", name="Carol")
class WorksWith(Relationship): pass
ac = WorksWith(a, c)
type(ac)
# 'WORKS_WITH'

常用函數:

  • relationship == other:如果relationship和other相等,則返回True。關係相等性基於開始節點,結束節點和關係類型的相等性(上面描述了節點相等性)。這意味着相同節點之間相同類型的任何兩個關係始終被視爲相等。請注意,此行爲與Neo4j本身稍有不同,Neo4j允許在相同節點之間使用相同類型的多個關係。
  • relationship != other:如果關係不相等,則返回True。
  • hash(relationship):根據其開始節點,結束節點和類型返回關係的哈希。
  • relationship[key]:返回關係的屬性key的值。如果沒有返回None
  • relationship[key] = value:設置關係的屬性key的值,若value是None,則刪除屬性值。
  • del relationship[key]:從關係中刪除key的屬性值,如果不存在這樣的屬性,則引發KeyError。
  • len(relationship):返回關係中的屬性數。
  • dict(relationship):返回關係中所有屬性的字典。
  • walk(relationship):執行walk(),依次產生其起始節點,關係本身及其終止節點。
  • type(relationship):返回此關係的類型。
  • relationship.graph:關係綁定到的數據庫(如果有)。
  • relationship.identity:數據庫中關係的ID。

Node和Relationship都繼承PropertyDict,PropertyDict繼承Python的內置詞典類。這意味着節點和關係都是可以包含按鍵索引的屬性值的映射類型。

類py2neo.data.PropertyDict(iterable,** kwargs)
該PropertyDict繼承Python的內置字典類型。除了下面描述的那些操作和方法外,所有操作和方法均與其基類相同。
常用方法:

  • properties == other:如果properties 等於other返回True,其中other是刪除掉所有None值再和properties比較。
  • properties != other:不等,返回True。
  • properties[key]:返回key屬性的值,若沒有返回None。
  • properties[key] = value:設置屬性值。
  • setdefault(key,默認= None):如果key在PropertyDict中,則返回其值。如果不是,key屬性插入具有默認值,並返回默認值,除非default爲None,在這種情況下不執行任何操作。
  • update(可迭代= None,** kwargs):使用來自iterable的鍵值對以及後面來自kwargs的關鍵字參數更新PropertyDict 。個別屬性已經在PropertyDict中將被覆蓋。

2.2 Subgraph

Subgraph是節點和關係的任意集合。根據定義,子圖必須至少包含一個節點;空子圖應以表示None。要測試是否爲空,可以使用bool()內置功能。
構造子圖的最簡單方法是使用標準集合操作將節點和關係組合在一起。例如:

>>> s = ab | ac
>>> s
{(alice:Person {name:"Alice"}),
 (bob:Person {name:"Bob"}),
 (carol:Person {name:"Carol"}),
 (Alice)-[:KNOWS]->(Bob),
 (Alice)-[:WORKS_WITH]->(Carol)}
>>> s.nodes()
frozenset({(alice:Person {name:"Alice"}),
           (bob:Person {name:"Bob"}),
           (carol:Person {name:"Carol"})})
>>> s.relationships()
frozenset({(Alice)-[:KNOWS]->(Bob),
           (Alice)-[:WORKS_WITH]->(Carol)})

類py2neo.data.Subgraph(節點,關係)

  • subgraph | other | ...:並集。返回subgraph、other包含的所有節點和關係構成的的新的子圖。任何實體將僅被包含一次。
  • subgraph & other & ...:交集。返回一個新的子圖,其中包含該子圖和other共有的所有節點和關係。
  • subgraph - other - ...:減。返回一個新的子圖,子圖中的節點和關係是subgraph中含有的,但在不存在other中的,通過關係相連的節點也包含在新子圖中,不管這些節點是否存在於subgraph或者other中。
  • subgraph ^ other ^ ...:返回一個新的子圖,該子圖包含的節點和關係只出現在subgraph中或者other中,通過關係相連的節點也包含在新子圖中,不管這些節點是否存在於subgraph或者other中。
  • subgraph.keys():返回該子圖中節點和關係使用的所有屬性鍵的集合。
  • subgraph.labels:返回此子圖中所有節點標籤的集合。
  • subgraph.nodes:返回此子圖中所有節點的集合。
  • subgraph.relationships:返回此子圖中所有關係的集合。
  • subgraph.types():返回此子圖中所有關係類型的集合。

2.3 Path對象和其他Walkable類型

Walkable是指Subgraph具有附加遍歷信息。 構造walkable的最簡單方法是連接其他圖對象:

>>> w = ab + Relationship(b, "LIKES", c) + ac
>>> w
(Alice)-[:KNOWS]->(Bob)-[:LIKES]->(Carol)<-[:WORKS_WITH]-(Alice)

通過使用該walk()函數可實現可行走對象的遍歷,該函數產生交替的節點和關係,並且始終以節點開始和結束。任何節點或關係都可以在任何方向上遍歷一次或多次。

類py2neo.data.Walkable(iterable)
常用方法:

  • walkable + other + ...:級聯。返回一個新的walkbale對象,walkable的尾結點與other的頭節點相同。
  • walk(walkable):walkable對象執行一個walk(),產生交替的節點和關係。
  • start_node:返回在walk()此對象的上遇到的第一個節點。
  • end_node:返回walk()此對象上遇到的最後一個節點。
  • nodes:返回在walkable上遍歷的所有節點的元組,按首次遇到的順序列出。
  • relationships:返回一個在walkable上遍歷的所有關係的元組,這些關係按首次遇到的順序列出。

類py2neo.data.Path(* 實體)
通過一些cypher查詢返回的walkable對象。

py2neo.data.walk(* walkbales)
遍歷提供的參數,依次產生交替的節點和關係。

2.4 Record對象

類py2neo.data.Record(iterable= ())
一個Record對象包含有序的鍵值對集合。它在許多方面類似於namedtuple,但是僅允許通過方括號語法訪問字段並提供更多功能。 Record繼承自tuple和Mapping。
常用方法:

  • record[index]record[key]:返回具有指定鍵或索引的record的值。
  • len(record):返回record中的字段數。
  • dict(record):返回記錄的字典表示形式。
  • data(* keys):以字典形式返回此記錄的鍵和值,可以選擇僅按索引或鍵僅包含某些值。所提供的記錄中不存在的鍵將被包括在內,其值爲None;提供的索引超出範圍將觸發IndexError。
    • parameters:keys –要包括的項目的索引或鍵;如果未提供任何值,則將包含所有值
    • return:值字典,以字段名稱爲jey
    • raises: IndexError 如果指定了越界索引
  • get(key,default= None):通過索引或鍵從記錄中獲取一個值。如果指定的項目不存在,則返回默認值。
    • parameters:
      • key –索引或鍵
      • default –如果鍵不存在,則返回默認值
    • return:選擇值
  • index(key):返回給定項目的索引。
  • items(* keys):返回鍵和值組成元組的列表
    • parameters:key 要包括的項目的索引或鍵;如果未提供任何值,則將包含所有值
    • return(鍵,值)元組列表
  • keys():返回記錄的鍵的列表。
  • to_subgraph():返回一個Subgraph包含這個Record中所有圖的並集。
  • values(* keys):返回記錄的值,可以選擇通過key或者index過濾只包含確定的值。
    • parameters:要包括的item的索引或鍵;如果未提供任何值,則將包含所有值
    • return 值的列表。

2.5 Table對象

類py2neo.data.Table(records,keys= None)
Table是包含Record對象列表,通常作爲Cypher查詢的結果。它提供了一個方便的容器來完整地處理結果,並提供了轉換爲各種輸出格式的方法。Table繼承list。
常用方法:

  • repr(table):返回包含此表的ASCII表示形式的字符串。在內部,此方法調用write()使用header = True調用,輸出io.StringIO實例。

  • _repr_html_():返回包含此表的HTML表示形式的字符串。Jupyter筆記本使用此方法在瀏覽器中本地顯示table。在內部,此方法write_html()使用header = True調用,輸出io.StringIO實例。

  • keys():返回此表的字段名稱列表。

  • field(key):返回給定字段的元數據字典。元數據包含以下值:

    • 類型:表示字段值的單個類或元組。
    • 數字:如果所有字段值都是數字類型,則爲True,否則False。
    • 可選的:如果任何字段值爲None, 則爲True,否則爲False。
  • write(file = None,header = None,skip = None,limit = None,auto_align = True,padding = 1,separator= '|',newline = '\ r \ n')
    將數據寫入人類可讀的ASCII表。

    • parameters:
      • file –能夠接收輸出的類似文件的對象
      • header –用於添加列標題的布爾值標誌
      • skip -開始輸出前要跳過的記錄數
      • limit –輸出中包含的最大記錄數
      • auto_align – if True,將數值右對齊
      • padding–列分隔符和值之間要包含的空格數
      • separator –列分隔符
      • newline –換行符序列
    • return:輸出中包含的記錄數
  • write_html(file = None,header = None,skip = None,limit = None,auto_align = True):將數據寫入HTML表。

    • parameters:
      • file –能夠接收輸出的類似文件的對象
      • header –用於添加列標題的布爾值標誌
      • skip -開始輸出前要跳過的記錄數
      • limit –輸出中包含的最大記錄數
      • auto_align – if True,將數值右對齊
    • return:輸出中包含的記錄數
  • write_separated_values(separeter,file= None,header= None,skip= None,limit= None,newline= '\ r \ n',quote= '“'):將數據寫入分隔符分隔的文件。

    • parameters:
      • separator –字段分隔符
      • file –能夠接收輸出的類似文件的對象
      • header –布爾標誌(或click.secho樣式字典),用於添加列標題
      • skip -開始輸出前要跳過的記錄數
      • limit –輸出中包含的最大記錄數
      • newline –換行符序列
      • quote–quote字符
    • return:輸出中包含的記錄數
  • write_csv(file = None,header = None,skip = None,limit = None):將數據寫爲RFC4180兼容的逗號分隔值。這是對的自定義調用write_separated_values()。

  • write_tsv(file = None,header = None,skip = None,limit = None):將數據寫成製表符分隔的值。這是對的自定義調用write_separated_values()。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章