在 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_from
、node_to
和 rel_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( ).
首先,我是新来的,如果这对你们中的一些人来说是一个简单的问题,我深表歉意。我正在尝试在 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_from
、node_to
和 rel_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( ).