cypher操作图数据库

2024-02-27 16:28
文章标签 操作 数据库 cypher

本文主要是介绍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操作图数据库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/752986

相关文章

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

数据库面试必备之MySQL中的乐观锁与悲观锁

《数据库面试必备之MySQL中的乐观锁与悲观锁》:本文主要介绍数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态