本文主要是介绍cypher操作图数据库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
简单示例
- sql语法
- 返回值
sql语法
- 在Match语法中,
无法
对关系
使用$
引入变量(案例中的max_path_len)。如果一定要引入,就使用format的字符串占位符方法。 - 在Match语法中,
允许
对节点的属性
使用$
引入变量。 - 如果sql已经使用了format格式,由于节点属性是用
{}
括起来的,f占位符也是用{}
括起来,未避免冲突,对属性值需要使用双{}
,如f"xxx (a:Company {{name:$name}})-[*…{max_path_len}]-()"。
返回值
- 返回值类型type(results) = <class ‘py2neo.cypher.Cursor’>,可迭代列表里的每个元素type(result) = <class ‘py2neo.cypher.Record’>。
- 通过
result['属性名']
的方式获取对应sql return里各个对象值。 - 节点
Node对象
默认是不可哈希
的,而set要求元素是可hash的,所以即使两个Node对象有相同的属性,它们也被视为是不同的对象,导致不能直接使用set(nodes)去重。
from py2neo import Graph# database_url = "http://localhost:7474"
database_url = "bolt://localhost:7687"
database_username = "neo4j"
database_password = "neo4jcf"# Bolt是Neo4j专门为图数据库设计的高性能网络协议,它是二进制的,比HTTP协议更快、更轻量级。
graph = Graph(database_url, auth=(database_username, database_password))# 查询的最大路径长度
max_path_len = 3def has_duplicates(nodes: tuple):# 由于Node对象默认是不可哈希的,而set要求元素是可hash的,所以即使两个Node对象有相同的属性,它们也被视为是不同的对象,导致不能直接使用set(nodes)去重。name_set = set(node["name"] for node in nodes)return len(nodes) != len(name_set)### 方案一:在节点中指定属性
cypher_query = f"""MATCH path=(a:Company {{name:$name}})-[*..{max_path_len}]-(b:Company)RETURN path"""### 方案二:在where中指定属性
# cypher_query = f"""
# MATCH path=(a:Company)-[*..{max_path_len}]-(b:Company)
# where a.name=$name
# RETURN path
# """### 一种:
results = graph.run(cypher_query, parameters={"name": "企业A"})
### 二种:
# results = graph.run(cypher_query, name="企业A")
print(f"type(results) = {type(results)}") # type(results) = <class 'py2neo.cypher.Cursor'>for result in results:'''path的值示例:Path(Node('Company', name='企业A', risk='否'), 工作单位(Node('Company', name='企业A', risk='否'), Node('Person', name='人A')), 认识(Node('Person', name='人A'), Node('Person', name='人B')), 董事(Node('Person', name='人B'), Node('Company', name='企业B', risk='是')))其中,type(result) = <class 'py2neo.cypher.Record'>'''path = result["path"]nodes = path.nodes # 获取路径中的所有节点,type(nodes)=tuple# 这个路径中没有重复的节点if not has_duplicates(nodes):print(path)
这篇关于cypher操作图数据库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!