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)

相关推荐
engchina1 天前
Neo4j数据库清理指南:如何安全地删除所有节点和索引
数据库·neo4j
麦麦大数据3 天前
vue+django+neo4j航班智能问答知识图谱可视化系统
django·vue·echarts·neo4j·智能问答·ltp·航班
engchina4 天前
docker 启动 neo4j
docker·容器·neo4j
阿梦Anmory5 天前
[neo4j报错]py2neo.errors.ClientError: [Request.Invalid] Not Found解决方案
neo4j
lisacumt6 天前
【neo4j】 neo4j cypher单一语句 optional 可选操作的技巧
neo4j
qa浪涛9 天前
基于知识图谱的教学案例问答系统
人工智能·django·知识图谱·neo4j
qa浪涛10 天前
基于知识图谱的美食推荐系统
人工智能·python·django·知识图谱·neo4j·美食
qa浪涛11 天前
基于neo4j的医疗问诊系统
python·django·知识图谱·neo4j
qa浪涛12 天前
基于neo4j的新冠治疗和新冠患者轨迹的知识图谱问答系统
人工智能·python·django·知识图谱·neo4j·1024程序员节
qa浪涛12 天前
基于neo4j的体育运动员问答问答系统
人工智能·django·知识图谱·neo4j