Neo4j cypher查询失败,出现未知语法错误
我有以下paramObj和dbQueryNeo4j cypher查询失败,出现未知语法错误,neo4j,cypher,Neo4j,Cypher,我有以下paramObj和dbQuery paramObj = { email: newUser.email, mobilenumber: newUser.telephone, password: newUser.password, category: newUser.category,
paramObj = {
email: newUser.email,
mobilenumber: newUser.telephone,
password: newUser.password,
category: newUser.category,
name: newUser.name,
confirmuid: verificationHash,
confirmexpire: expiryDate.valueOf(),
rewardPoints: 0,
emailconfirmed: 'false',
paramVehicles: makeVehicleArray,
paramVehicleProps: vehiclePropsArray
}
dbQuery = `CREATE (user:Person:Owner {email:$email})
SET user += apoc.map.clean(paramObj,
['email','paramVehicles','paramVehiclesProps'],[])
WITH user, $paramVehicles AS vehicles
UNWIND vehicles AS vehicle
MATCH(v:Vehicles {name:vehicle})
CREATE UNIQUE (user)-[r:OWNS {since: timestamp()}]->(v)
RETURN user,r,v`;
然后我试着执行
commons.session
.run(dbQuery, paramObj)
.then(newUser => {
commons.session.close();
if (!newUser.records[0]) {........
我越来越
Error: {"code":"Neo.ClientError.Statement.SyntaxError","name":"Neo4jError"}
这不会指引我去任何地方。谁能告诉我我做错了什么
这实际上是我第一次使用查询格式.run(dbQuery,paramObj)
,但是这种格式对于我的用例来说是至关重要的。我正在使用安装了apoc插件的Neo4j 3.4.5社区
好的……所以我按照@InverseFalcon的建议在浏览器中进行测试,并得出了与上述参数和查询非常匹配的以下参数和查询:
:params paramObj:[{ email:"xyz123@abc.com", mobilenumber:"8711231234",password:"password1", category:"Owner",name:"Michaell",vehicles:["Toyota","BMW","Nissan"],vehicleProps: [] }]
和查询
PROFILE
CREATE (user:Person:Owner {email:$email})
SET user += apoc.map.clean($paramObj, ["email","vehicles","vehicleProps"],[])
WITH user, $vehicles AS vehicles
UNWIND vehicles AS vehicle
MATCH(v:Vehicles {name:vehicle})
MERGE (user)-[r:OWNS {since: timestamp()}]->(v)
RETURN user,r,v;
现在我明白了
Neo.ClientError.Statement.TypeError:无法强制'List{Map{name->String(“Michaell”)、vehicles->List{String(“丰田”)、String(“宝马”)、String(“日产”)}、
我也回到了neo4j 3.2(re:Mark Needham的早期文章),并得到了相同的错误。您应该尝试使用浏览器对查询进行解释,以排除故障 我在这里看到的一些事情: 您引用的是
paramObj
,但它不是一个参数(而是您传入的参数映射,但它本身不是您可以在查询中引用的参数)。如果需要引用传入的整个参数集,则需要使用嵌套映射,并使paramObj
成为作为参数映射传递的映射中的键(并且在查询中使用它时,需要使用$paramObj
)
CREATE UNIQUE
已被弃用,您应该改用MERGE
,不过请注意,它的行为方式确实不同(请参阅以及我们的知识库文章,其中解释了一些容易遗漏的详细信息)。您应该尝试使用浏览器对查询进行解释,以排除故障
我在这里看到的一些事情:
您引用的是paramObj
,但它不是一个参数(而是您传入的参数映射,但它本身不是您可以在查询中引用的参数)。如果需要引用传入的整个参数集,则需要使用嵌套映射,并使paramObj
成为作为参数映射传递的映射中的键(并且在查询中使用它时,需要使用$paramObj
)
CREATE UNIQUE
已被弃用,您应该改用MERGE
,不过请注意,它的行为方式确实不同(请参阅以及我们的知识库文章,其中解释了.我不确定是什么原因导致强制错误消失,但它在同一个查询中消失了,我得到了一个“预期参数错误”,这是通过使用$paramObj.email等修复的。因此,最终的查询如下所示:
CREATE (user:Person:Owner {email: $paramObj.email})
SET user += apoc.map.clean($queryObj, ["email","vehicles","vehicleProps"],[])
WITH user, $paramObj.vehicles AS vehicles
UNWIND vehicles AS vehicle
MATCH(v:Vehicles {name:vehicle})
MERGE (user)-[r:OWNS {since: timestamp()}]->(v)
RETURN user,r,v;
它修复了我在使用SET+=map时如何从映射中删除属性的原始问题。我不确定是什么导致强制错误消失,但它在同一个查询中消失了,我得到了一个“预期参数错误”,这是通过使用$paramObj.email等修复的。因此,最终查询如下所示:
CREATE (user:Person:Owner {email: $paramObj.email})
SET user += apoc.map.clean($queryObj, ["email","vehicles","vehicleProps"],[])
WITH user, $paramObj.vehicles AS vehicles
UNWIND vehicles AS vehicle
MATCH(v:Vehicles {name:vehicle})
MERGE (user)-[r:OWNS {since: timestamp()}]->(v)
RETURN user,r,v;
这修复了我最初在使用SET+=map时如何从映射中删除属性的问题。我已经用您的一些建议编辑了这个问题,现在我认为我们正在取得进展……但我现在遇到了强制错误。另外,apoc.map.clean()或apoc.map.removeKeys()会出现吗对paramObj进行变异,使其在查询中不再可用?它们不是变异子,它们应该返回一个单独的映射,并应用更改,原始映射应该仍然可以在应用更改时使用,
paramObj
现在指的是列表,而不是映射,看到那些方括号了吗?摆脱thoseI我用一些y编辑了这个问题我们的建议现在我认为我们正在取得进展……但我现在发现了强制错误。另外,apoc.map.clean()或apoc.map.removeKeys()会出现吗对paramObj进行变异,使其在查询中进一步不可用?它们不是变异子,它们应该返回一个单独的映射,并应用更改,原始映射应该仍然可用于您应用的更改,paramObj
现在指的是列表,而不是映射,看到那些方括号了吗?去掉那些