Neo4j cypher查询失败,出现未知语法错误

Neo4j cypher查询失败,出现未知语法错误,neo4j,cypher,Neo4j,Cypher,我有以下paramObj和dbQuery paramObj = { email: newUser.email, mobilenumber: newUser.telephone, password: newUser.password, category: newUser.category,

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

好的……所以我按照@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
现在指的是列表,而不是映射,看到那些方括号了吗?去掉那些