如何在Python Neo4J中使用字典参数

问题描述 投票:0回答:1

我正在使用py2neo在Python中运行Cypher查询。目前,我正在传递$user_id$name的值。

query = "MATCH (user:User{id:$user_id, name: $name}) MATCH (user)-[rout]->() WITH user, collect(DISTINCT {relationship: type(rout), node: endNode(rout)}) AS extended_info RETURN { user: user, extended_info: extended_info } AS result"

graph.run(query, parameters= {"user_id": 1, "name": "Vivek"}).data()

我不仅要传递值,还想传递键和值的字典。像这样:

{id:1, name: "Vivek"}

并直接在查询中使用它。这将使我能够灵活地编写单个查询以过滤一个或多个属性。

query = "MATCH (user:User{$params}) MATCH (user)-[rout]->() WITH user, collect(DISTINCT {relationship: type(rout), node: endNode(rout)}) AS extended_info RETURN { user: user, extended_info: extended_info } AS result"

graph.run(query, parameters= {id:1, name: "Vivek"}).data()

是否有使用py2neo的方法?还是有其他方法为匹配查询编写单个查询?

python neo4j py2neo
1个回答
0
投票

如果可以的话,一种解决方案是使用字符串格式来动态构建查询:

  1. 首先尝试创建具有属性的查询。

    query = "MATCH (u:User {{ {properties} }}) RETURN u.name"
    

    [{properties}将被替换为字符串格式,而在字符串格式化期间,{{ ... }}将被转换为单括号{..}

  2. 定义您的参数:警告请记住,在python中,字典键必须是字符串(嗯,不仅是这样,在这种情况下是))

    parameters = {"id": 1, "name": "Toto"}
    
  3. 为py2neo创建属性列表:

    properties = ', '.join('{0}: ${0}'.format(n) for n in parameters)
    
  4. 格式化查询:

    query2 = query.format(properties=properties)
    print(query2)
    

    query2现在看起来像这样:

    MATCH (u:User { id: $id, name: $name }) RETURN u.name
    
  5. 最后,您可以使用参数运行query2

    r = graph.run(query2, parameters=parameters)
    print(r.data())
    

注意,我们可以完全格式化字符串以在其中注入参数,但是我更愿意让py2neo在此处执行必要的检查。

© www.soinside.com 2019 - 2024. All rights reserved.