cypher操作图数据库

简单示例

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 = 3

    def 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)

相关推荐
AugustRed1 天前
Neo4j 图数据库原理 + 应用场景简单介绍
数据库·neo4j
Thomas.Sir7 天前
第34课:TensorFlow|TF迁移学习实战【调用官方预训练模型微调训练】
tensorflow·neo4j·迁移学习
数据库小学妹17 天前
关系型数据库内置图查询来了:SQL/PGQ标准怎么用
数据库·图数据库·关系型数据库·图查询·数据库新特性
xing-xing19 天前
Neo4j学习总结
neo4j
JOker_Chu_22 天前
知识图谱详解:从图结构、关系建模到查询与应用
数据库·知识图谱·database·neo4j
veminhe24 天前
使用neo4j构建知识图谱
人工智能·知识图谱·neo4j
星川皆无恙1 个月前
大数据知识图谱项目:基于neo4j知识图谱+flask的大数据电影问答系统(超详细讲解及源码)
大数据·知识图谱·neo4j
jinggongszh1 个月前
企业知识库的第三条路:PG16做事实源,Neo4j做图投影
知识图谱·neo4j·rag·企业知识库·postgresql 16·证据链
是赵敢敢啊1 个月前
自定义注解@SyncNeo4j实现增删改导入时自动同步数据节点和关系到Neo4j
neo4j
心念枕惊2 个月前
Conda 环境一键搬家:用 conda-pack 打包带走,连网都不用
conda·neo4j