在 py2neo Cypher 查询中使用参数的正确方法

Correct way of using parameters in py2neo Cypher query

首先,我是新来的,如果这对你们中的一些人来说是一个简单的问题,我深表歉意。我正在尝试在 py2neo 查询中使用参数,但是出现错误我不确定如何修复。 首先,这是一个没有任何参数的查询和函数版本:

def link_nodes_from_csv(graph):

    # https://drive.google.com/uc?id=id&export=download
    query = """
           LOAD CSV WITH HEADERS FROM "https://drive.google.com/uc?id=id&export=download" AS line 
           FIELDTERMINATOR '\t'
                   MATCH (ll:LessonLearnedId{id:line.lesson_id})
                   MATCH (lessonTopic:LessonLearnedTopic{id:line.topic_id})
                   CALL apoc.create.relationship(lessonTopic, line.lesson_id,{}, ll) YIELD rel
                   REMOVE rel.noOp
            """
    result = graph.run(query)
    nodes = [n for n in result]
    print(nodes)

这很成功,我能够创建我需要的关系。您可以看到关系名称与课程的 ID 相同(列名 lesson_id)。现在我需要使用 node_fromnode_torel_label,因为它们包含我需要的参数,所以现在我的函数和查询如下所示:

# node_from/node_to: dictionary {node_type, attribute, column header }
def link_nodes_from_csv(graph, node_from, node_to, rel_label):

    query = """
            LOAD CSV WITH HEADERS FROM "https://drive.google.com/uc?id=id&export=download" AS line 
            FIELDTERMINATOR '\t'
                MATCH (n:{node_from[0]}) WHERE n.{node_from[1]}=line.{node_from[2]}
                MATCH (m:{node_to[0]}) WHERE m.{node_to[1]} = line.{node_to[2]}
                CALL apoc.create.relationship(m, line.{rel_label},{}, n) YIELD rel
                REMOVE rel.noOp
            """
    result = graph.run(query)
    nodes = [n for n in result]
    print(nodes)

这个查询给我以下错误:

我还尝试了以下操作:

# node_from/node_to: dictionary {node_type, attribute, column header }
def link_nodes_from_csv(graph, node_from, node_to, rel_label):

    
    query = """
            LOAD CSV WITH HEADERS FROM "https://drive.google.com/uc?id=id&export=download" AS line 
            FIELDTERMINATOR '\t'
                MATCH (n:{param1}) WHERE n.{param2}=line.{param3}
                MATCH (m:{param4}) WHERE m.{param5} = line.{param6}
                CALL apoc.create.relationship(m, line.{param7},{}, n) YIELD rel
                REMOVE rel.noOp
            """
    result = graph.run(query, parameters={"param1":node_from[0], "param2": node_from[1], "param3": node_from[2],
                                          "param4": node_to[0], "param5": node_to[1], "param6": node_to[2],
                                          "param7": rel_label})
    nodes = [n for n in result]
    print(nodes)

然而,这或多或少给了我同样的错误:

最后,我尝试了这个:

# node_from/node_to: dictionary {node_type, attribute, column header }
def link_nodes_from_csv(graph, node_from, node_to, rel_label):


    query = """
            LOAD CSV WITH HEADERS FROM "https://drive.google.com/uc?id=id&export=download" AS line 
            FIELDTERMINATOR '\t'
                MATCH (n:LessonLearnedId) WHERE n.{param2}=line.{param3}
                MATCH (m:LessonLearnedTopic) WHERE m.{param5} = line.{param6}
                CALL apoc.create.relationship(m, line.{param7},{}, n) YIELD rel
                REMOVE rel.noOp
            """
    result = graph.run(query, parameters={"param2": node_from[1], "param3": node_from[2], "param5": node_to[1],
                                          "param6": node_to[2], "param7": rel_label})
    nodes = [n for n in result]
    print(nodes)

但是这也给了我同样的错误:

  raise self._failure
py2neo.errors.ClientError: [Statement.SyntaxError] Invalid input '{': expected an identifier, whitespace, a function name or a property key name (line 4, column 51 (offset: 214))
"                MATCH (n:LessonLearnedId) WHERE n.{param2}=line.{param3}"
                                                   ^

我不太确定如何解决这个问题。很感谢任何形式的帮助。我还可以提供其他信息,但我不确定具体有什么帮助,所以请询问您是否需要我提供任何有助于解决此问题的信息。非常感谢。

我通常看到参数用于表示值,而不是键。我不确定他们能否按照您的预期工作。

我想知道您是否可以重新考虑您的数据模型。如果您的 CSV 中有很多 lessonTopic 值,那么它似乎不是关系类型的好选择。这个免费课程可能会给你一些启发。 https://neo4j.com/graphacademy/training-gdm-40/enrollment/

如果您确实需要动态 Cypher,可以使用 Python 字符串格式化方法将 属性 键和关系类型插入到查询字符串中,然后将查询传递给 graph.run( ).