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)

相关推荐
问问计算机2 天前
2.Neo4j是什么?
neo4j
羊羊小栈2 天前
基于知识图谱(Neo4j)和大语言模型(LLM)的图检索增强(GraphRAG)的台风灾害知识问答系统(vue+flask+AI算法)
人工智能·毕业设计·知识图谱·创业创新·neo4j·毕设·大作业
FserSuN2 天前
GraphRAG 与 Neo4j 社区版:能力边界与适用场景学习总结
学习·neo4j
掘金安东尼4 天前
深入 Neo4j:从图数据库原理到企业知识引擎的实践指南
数据库·neo4j
熊文豪4 天前
Windows安装Neo4j保姆级教程(图文详解)
neo4j
Maer095 天前
Neo4j+Gephi制作社区检测染色图
neo4j
叶楊7 天前
数据处理常用函数
neo4j
向阳蒲公英9 天前
http://localhost:7474/browser/ 登陆之后账号密码neo4j / neo4j 不对 页面出现以下:
neo4j
BTU_YC10 天前
Neo4j查询计划完全指南:读懂数据库的“执行蓝图“
数据库·neo4j