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)

相关推荐
一叶屋檐1 小时前
Neo4j 图书馆借阅系统知识图谱设计
服务器·数据库·cypher
从零开始学习人工智能5 小时前
在 Neo4j 中实现向量化存储:从文本到高效语义搜索
neo4j
楠奕5 小时前
python中使用neo4j
开发语言·python·neo4j
Ailovelearning5 小时前
neo4j框架:ubuntu系统中neo4j安装与使用教程
数据库·neo4j
IT小郭.12 小时前
使用 Docker Desktop 安装 Neo4j 知识图谱
windows·python·sql·docker·知识图谱·database·neo4j
AI大模型顾潇2 天前
[特殊字符] 本地大模型编程实战(29):用大语言模型LLM查询图数据库NEO4J(2)
前端·数据库·人工智能·语言模型·自然语言处理·prompt·neo4j
辛一一3 天前
neo4j图数据库基本概念和向量使用
数据库·neo4j
Ultipa4 天前
回答 | 图形数据库neo4j社区版可以应用小型企业嘛?
数据库·neo4j·图数据库
火云牌神6 天前
在windows系统中安装图数据库NEO4J
数据库·windows·neo4j
joker_sxj7 天前
【已解决】Neo4j Desktop打不开,不断网解决
neo4j