我有以下paramObj和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, paramObj)
,但是这种格式对我的用例至关重要。我正在使用安装了apoc插件的Neo4j 3.4.5社区。 p>
好吧...所以我遵循@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.Statement.TypeError:无法强制使用List {Map {name-> String(“ Michaell”),车辆-> List {String(“ Toyota”),String(“ BMW”),String(“ Nissan “)},.......
我还恢复到neo4j 3.2(re:Mark Needham的较早文章),并得到相同的错误。
答案 0 :(得分:2)
您应该尝试使用浏览器对查询进行解释,以对其进行故障排除。
我在这里看到的一些东西:
您指的是paramObj
,但这不是参数(而是您要传入的参数的映射,但它本身不是您可以在查询中引用的参数)。如果您需要引用要传递的整个参数集,则需要使用嵌套映射,并在将paramObj
作为要传递给参数映射的映射中使用键(以及在将其用作参数映射时)查询,您需要使用$paramObj
)
CREATE UNIQUE
已过时,您应改用MERGE
,尽管要注意它的行为方式有所不同(请参阅MERGE documentation以及我们的知识库文章,其中介绍了一些how MERGE works的容易错过的细节。
答案 1 :(得分:0)
我不确定是什么原因导致了强制错误的消失,但是在相同的查询中却发生了,并且我收到了“预期参数错误”,该错误已通过使用$ 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时如何从地图中删除属性。