我正在使用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' }})