我有以下参数Obj和dbQuery
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,参数Obj)
,但这种格式对我的用例至关重要。我正在使用安装了apoc插件的Neo4j 3.4.5社区。
好的…所以我按照@inversFalcon的建议在浏览器中进行测试,并提出了以下与上述参数和查询非常匹配的参数和查询:
: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.State.TypeError:不能强制'List{Map{name-
我也恢复到neo4j 3.2(re: Mark Needham的早期帖子)并得到同样的错误。
您应该尝试使用浏览器对查询进行解释以对其进行故障排除。
我在这里看到的一些事情:
您引用的是ParamObj
,但它不是参数(更确切地说,它是您传入的参数映射,但它本身不是您可以在查询中引用的参数)。如果您需要引用传入的整个参数集,那么您需要使用嵌套映射,并让ParamObj
成为映射中的一个键,作为参数映射传递(当您在查询中使用它时,您需要使用$ParamObj
)
CREATE UNIQUE
已弃用,您应该使用MERGE
,但请注意它的行为方式不同(请参阅MERGE留档以及我们的知识库文章,解释了一些容易错过的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时如何从地图中删除属性的问题。