提问者:小点点

Neo4j密码查询失败,语法错误未知


我有以下参数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的早期帖子)并得到同样的错误。


共2个答案

匿名用户

您应该尝试使用浏览器对查询进行解释以对其进行故障排除。

我在这里看到的一些事情:

您引用的是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时如何从地图中删除属性的问题。