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

时间:2018-11-23 00:50:02

标签: neo4j cypher

我有以下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社区。

好吧...所以我遵循@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的较早文章),并得到相同的错误。

2 个答案:

答案 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时如何从地图中删除属性。