【问题标题】:Neo4j cypher query fails with unknown syntax errorNeo4j 密码查询因未知语法错误而失败
【发布时间】:2018-11-23 00:50:02
【问题描述】:

我有以下 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(回复:Mark Needham 的早期帖子)并得到了同样的错误。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

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

    我在这里看到的一些东西:

    您指的是paramObj,但它不是参数(相反,它是您传入的参数映射,但它本身不是您可以在查询中引用的参数)。如果您需要引用传入的整组参数,则需要使用嵌套映射,并将 paramObj 作为映射中的键,作为参数映射传递(并且当您在查询中使用它时) , 你需要使用$paramObj)

    CREATE UNIQUE 已弃用,您应该改用MERGE,但请注意它的行为方式不同(请参阅MERGE documentation 以及我们的知识库文章,其中解释了一些容易错过的how MERGE works) 的详细信息。

    【讨论】:

    • 我已经根据您的一些建议编辑了这个问题,现在我认为我们正在取得进展......但我现在遇到了强制错误。
    • 另外,apoc.map.clean() 或 apoc.map.removeKeys() 是否会改变 paramObj 使其无法在查询中进一步使用?
    • 它们不是变异器,它们应该返回一个单独的映射并应用更改,原始映射应该仍然可用
    • 随着您应用的更改,paramObj 现在指的是列表,而不是地图,看到那些方括号了吗?摆脱那些
    【解决方案2】:

    我不确定是什么导致强制错误消失,但它使用相同的查询,我得到一个“预期参数错误”,这是通过使用 $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 += 地图时如何从地图中删除属性的原始问题。

    【讨论】:

      猜你喜欢
      • 2020-05-02
      • 1970-01-01
      • 2018-03-26
      • 2017-05-08
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多