python使用Neo4j图数据库——py2neo详解(1)
py2neo.database包包含与Neo4j服务器交互所需的类和方法。为方便起见,这些类中的许多类也通过top-level包公开py2neo。
提供的最有用的类是Graph,表示一个Neo4j图形数据库实例并提供对大部分最常用py2neo API的访问的类。
要对本地数据库运行query很简单:
>>> from py2neo import Graph
>>> graph = Graph(password="password")
>>> graph.run("UNWIND range(1, 3) AS n RETURN n, n * n as n_sq").to_table()
n | n_sq
-----|------
1 | 1
2 | 4
3 | 9
class py2neo.database.GraphService
通过Bolt或HTTP进行整个Neo4j图形数据库安装的访问器。在py2neo对象层次结构中,GraphService包含Graph大多数活动。
在早期版本中,这个类是Database。
可以将显式URI传递给构造函数:
>>> from py2neo import GraphService
>>> gs = GraphService("bolt://camelot.example.com:7687")
或者,使用默认值bolt://localhost:7687:
>>> default_gs = GraphService()
>>> default_gs
<GraphService uri='bolt://localhost:7687'>
属性:
-config
:返回用于配置Neo4j的配置参数的字典。
default_graph
:此图数据库服务公开的默认图。返回类型:Graph。kernel_version
:返回Neo4j的版本。product
:返回产品名称。system_graph
:此图数据库服务公开的图数据库。返回类型:SystemGraph。uri
:此GraphService连接到的URI 。forget_all()
:忘记所有缓存的GraphService详细信息。class py2neo.database.Graph(uri,name= None,** settings)
这个图形类表示的Neo4j图形数据库内的图数据的存储空间。使用URI和(或)单个设置提供连接详细信息。
该name参数允许按名称图形数据库的选择。当使用Neo4j 4.0及更高版本时,它可以是系统目录中定义的任何名称,可以通过Cypher 命令SHOW DATABASES获得其完整列表。此处为None将选择服务器上定义的默认数据库。对于Neo4j的早期版本,名称必须设置为None。
from py2neo import Graph
sales = Graph("bolt+s://g.example.com:7687", name="sales")
sales.run("MATCH (c:Customer) RETURN c.name")
c.name
---------------
John Smith
Amy Pond
Rory Williams
在所有4.x +产品版本中都可用的系统图也可以通过SystemGraph该类进行访问。
from py2neo import SystemGraph
sg = SystemGraph("bolt+s://g.example.com:7687")
sg.call("dbms.security.listUsers")
username | roles | flags
----------|-------|-------
neo4j | null | []
支持的URI方案是:
支持的完整设置包括:
keyword | description | type | default |
---|---|---|---|
scheme | 使用特定的URI方案 | str | ‘bolt’ |
secure | 使用安全连接(TLS) | bool | False |
verify | 验证服务器证书(如果安全) | bool | True |
host | 数据库服务器主机名 | str | ‘localhost’ |
port | 数据库服务器端口 | 整型 | 7687 |
address | 用冒号分隔的主机和端口字符串 | str | ‘localhost:7687’ |
user | 用户身份验证 | str | ‘neo4j’ |
password | 用于认证的密码 | str | ‘password’ |
auth | 2位元组(用户名和密码) | 元组 | (‘neo4j’, ‘password’) |
user_agent | 用户代理发送所有连接 | str | (取决于URI方案) |
max_connections | 允许的最大同时连接数 | 整型 | 40 |
每个设置都可以作为关键字参数或URI的一部分提供。因此,以下三个示例都是等效的:
>>> from py2neo import Graph
>>> graph_1 = Graph()
>>> graph_2 = Graph(host="localhost")
>>> graph_3 = Graph("bolt://localhost:7687")
一旦获得,Graph实例将提供对py2neo内大多数可用功能的直接或间接访问。
请注意,py2neo不支持使用Neo4j因果群集进行路由。要使用此功能,请使用官方的Python Neo4j驱动程序。
常用方法:
from py2neo import Graph
g = Graph()
g.call("dbms.components")
name | versions | edition
--------------|-----------|-----------
Neo4j Kernel | ['4.0.2'] | community
create(subgraph):在GraphTransaction中运行GraphTransaction.create()操作。
delete(subgraph):在GraphTransaction中运行操作GraphTransaction.delete()。若要仅删除关系,请使用separate()方法。
注意,只有通过graph和identity 属性绑定到相应数据库实体的实体才会触发删除。
delete_all():从这个Graph删除所有节点和关系。
警告 此方法将从图表中永久删除所有节点和关系,并且无法撤消。
evaluate(cypher,parameters= None,** kwparameters):在 GraphTransaction中 运行操作GraphTransaction.evaluate()。
exists(subgraph):在 GraphTransaction中 运行操作 GraphTransaction.exists()。
match(node= None,r_type = None,limit= None):匹配并返回具有特定条件的所有关系。
例如,查找所有Alice的朋友:
for rel in graph.match((alice, ), r_type="FRIEND"):
print(rel.end_node["name"])
from py2neo import Graph, Node, Relationship
g = Graph()
a = Node("Person", name="Alice", age=33)
b = Node("Person", name="Bob", age=44)
KNOWS = Relationship.type("KNOWS")
g.merge(KNOWS(a, b), "Person", "name")
接下来,我们创建两个原始节点都连接到的第三个节点(不同类型):
c = Node("Company", name="ACME")
c.__primarylabel__ = "Company"
c.__primarykey__ = "name"
WORKS_FOR = Relationship.type("WORKS_FOR")
g.merge(WORKS_FOR(a, c) | WORKS_FOR(b, c))
请注意,这与Cypher MERGE不同。
play(work,args = None,kwargs = None,after = None,metas = None,timeout = None):调用代表GraphTransaction工作单元的函数。
该函数必须始终接受一个GraphTransaction 对象作为其第一个参数。可以通过此方法的args和kwargs参数传递其他参数。
如果函数具有readonly属性,并且将其设置为真实值,则将在可能的情况下在只读环境中执行。
如果函数具有timeout属性,并且没有timeout参数传递给此方法调用,则将使用函数属性的值代替设置超时。
pull(subgraph):从数据库中提取到一个或多个实体。
push(subgraph):将数据从一个或多个实体推送到数据库中对等实体。
-subgraph –要推送的节点和关系的集合
属性nodes:这个图获得一个NodeMatcher。
这可用于查找符合给定条件的节点:
graph = Graph()
graph.nodes[1234]
(_1234:Person {name: 'Alice'})
graph.nodes.get(1234)
(_1234:Person {name: 'Alice'})
graph.nodes.match("Person", name="Alice").first()
(_1234:Person {name: 'Alice'})
使用此属性也可以有效地计算节点数:
len(graph.nodes)
55691
len(graph.nodes.match("Person", age=33))
12
类py2neo.database.Schema(graph)
Graph实例的schema。
方法:
SystemGraph
class py2neo.database.SystemGraph(uri,** settings)
Graph的子类提供对DBMS的系统数据库的访问。仅在Neo4j 4.0及更高版本中可用。
class py2neo.database.GraphTransaction(autocommit = False)
一个或多个图操作的逻辑上下文。
>>> from py2neo import Graph, Node, Relationship
>>> g = Graph()
>>> tx = g.begin()
>>> a = Node("Person", name="Alice")
>>> tx.create(a)
>>> b = Node("Person", name="Bob")
>>> ab = Relationship(a, "KNOWS", b)
>>> tx.create(ab)
>>> tx.commit()
>>> g.exists(ab)
True
class py2neo.database.Cursor(result, hydrant=None, entities=None)
cursor记录record流。
可以将游标视为基础数据流上的窗口。py2neo中的所有游标都是“仅向前”的,这意味着导航在第一个记录之前开始,并且可能仅在向前方向上进行。
应用程序代码通常不需要直接实例化游标,因为任何Cypher执行方法都将返回该游标。但是,创建游标仅需要一个DataSource对象,该对象包含如何访问游标导航的源数据的逻辑。
许多简单的游标用例仅需要forward()方法和current属性。要浏览所有可用记录,可以使用while循环:
while cursor.forward():
print(cursor.current["name"])
如果只关注第一个记录,则类似的if结构将完成此工作:
if cursor.forward():
print(cursor.current["name"])
要将正向和电流合并为一个步骤,请使用内置的python方法:next函数:
print(next(cursor)["name"])
游标也是可迭代的,因此可以循环使用:
for record in cursor:
print(record["name"])
对于期望在单个记录中仅返回单个值的查询,请使用evaluate()方法。这将从下一条记录返回第一个值,如果字段和记录均不存在,则返回None:
print(cursor.evaluate())
>>> from py2neo import Graph
>>> graph = Graph()
>>> graph.run("MATCH (a:Person) RETURN a.name, a.born LIMIT 4").data()
[{'a.born': 1964, 'a.name': 'Keanu Reeves'},
{'a.born': 1967, 'a.name': 'Carrie-Anne Moss'},
{'a.born': 1961, 'a.name': 'Laurence Fishburne'},
{'a.born': 1960, 'a.name': 'Hugo Weaving'}]
如果光标不能向前移动,或者记录中没有任何值,则将返回None。
当已知Cypher查询仅返回单个值时,此方法特别有用。
例
from py2neo import Graph
g = Graph()
g.run("MATCH (a) WHERE a.email=$x RETURN a.name", x="[email protected]").evaluate()
'Bob Robertson'
from py2neo import Graph
g = Graph()
g.run("CREATE (a:Person) SET a.name = 'Alice'").stats()
constraints_added: 0
constraints_removed: 0
contained_updates: True
indexes_added: 0
indexes_removed: 0
labels_added: 1
labels_removed: 0
nodes_created: 1
nodes_deleted: 0
properties_set: 1
relationships_created: 0
relationships_deleted: 0
>>> from py2neo import Graph
>>> graph = Graph()
>>> graph.run("MATCH (a:Person) RETURN a.name, a.born LIMIT 4").to_data_frame()
a.born a.name
0 1964 Keanu Reeves
1 1967 Carrie-Anne Moss
2 1961 Laurence Fishburne
3 1960 Hugo Weaving
注意 此方法需要安装pandas。
class py2neo.database.CypherStats(**stats)
从Cypher查询执行中提取的一组统计信息的容器。
每个值都可以作为属性或通过字符串索引进行访问。此类实现Mapping为允许将其用作字典。
class py2neo.database.GraphError(* args,** kwargs)
class py2neo.database.ClientError(* args,** kwargs)
客户发送了错误的请求-更改请求可能会产生成功的结果。
class py2neo.database.DatabaseError(* args,** kwargs)
数据库无法处理请求。
class py2neo.database.TransientError(* args,** kwargs)
数据库现在无法处理请求,稍后重试可能会产生成功的结果。
class py2neo.database.GraphTransactionError(* args,** kwargs)
当尝试针对GraphTransaction 不再可用的或交易无效时引发。