我正在使用Neo4j,它具有一个子句以允许一次设置多个属性:

 MATCH (p:Person)
 WHERE p.email = '${userEmail}'
 SET p += ${argsToUpdate}
 RETURN p AS Person


但是,我无法进入查询argsToUpdate,因为Neo4j正在寻找与此处显示的字符串完全相同的字符串:

 { email: '[email protected]', age: 1337, colour: 'blue' }


我可以使用JSON.stringify(argsToUpdate) regex并剥离\和“,但这很不理想,因为某些属性可能包含这些字符。也许可以先对它们进行编码。

我也尝试过JSON.parse(JSON.stringify(argsToUpdate))

我使用了util.inspect(argsToUpdate),并且效果很好,但是我的开发负责人不接受它,因为它是一个node.js调试方法。

有没有简单的方法可以实现另一种方法?

我不想做这样的for循环:

 let args = '{ '
 for (let i = 0; i < Object.keys(argsToUpdate).length; i++) {
     args += `${prop[i]}: ${key[i]}`
 }
 args += ' }'


有有效的方法吗?问题是argsToUpdate包含可变数量的属性。我希望它是动态的,这样代码就不会那么脆弱。 ES6 +中是否有包括babel在内的任何可实现util.inspect(argsToUpdate)结果的东西?

最佳答案

假设您正在使用默认的neo4j驱动程序,则应该能够将所有参数传递到标准javascript数据结构中的查询中,而不必担心像这样的字符串转义。我认为问题在于您的参数命名不正确。

密码参数必须由unicode字母组成,并且不能以货币符号开头。反引号中包含的名称可以包含空格。因此,应采用如下形式。


{someParam}
$someParam


甚至类似下面的两个。

{ `some param with spaces in the name` }
$`some param with spaces in the name`


考虑到这一点,下面的查询应该起作用。

session
  .run('MATCH (p:Person) WHERE p.email = $userEmail SET p += $argsToUpdate RETURN p AS Person', {userEmail: '[email protected]', argsToUpdate: { email: '[email protected]', age: 1337, colour: 'blue' }})

09-25 17:35