我正在使用Neo4j,它有一个允许一次设置多个属性的子句:
PSPDFKit.showDocumentFromAssets('Layout.pdf', {
title: 'My PDF Document',
page: 4,
scrollDirection: PSPDFKit.PageScrollDirection.VERTICAL,
scrollMode: PSPDFKit.ScrollMode.CONTINUOUS,
useImmersiveMode: true
},success(success){
console.log('success')
},fail(fail){
console.log(fail);
});
但是,我无法将 MATCH (p:Person)
WHERE p.email = '${userEmail}'
SET p += ${argsToUpdate}
RETURN p AS Person
放入查询中,因为Neo4j正在查找与此处显示的完全相同的字符串:
argsToUpdate
我可以使用 { email: 'test@test.com', age: 1337, colour: 'blue' }
正则表达式和条带\和“但这是次要的,因为某些属性可能包含这些字符。也许它们可以先编码。
我也试过JSON.stringify(argsToUpdate)
。
我使用JSON.parse(JSON.stringify(argsToUpdate))
并且它工作正常,但我的开发人员不会接受它,因为它是node.js调试方法。
是否有一种简单的方法可以实现另一种方式?
我不想做像这样的for循环:
util.inspect(argsToUpdate)
有一种有效的方法吗?问题是 let args = '{ '
for (let i = 0; i < Object.keys(argsToUpdate).length; i++) {
args += `${prop[i]}: ${key[i]}`
}
args += ' }'
包含可变数量的属性。我希望它是动态的,以便代码不那么脆弱。 ES6 +中是否有任何可用的东西,包括可以达到argsToUpdate
的结果?
答案 0 :(得分:1)
假设您正在使用默认的neo4j驱动程序,您应该能够将所有参数传递给标准javascript数据结构中的查询,而不必担心像这样的字符串转义。我认为问题是您的参数名称不正确。
Cypher参数必须由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: 'test@test.com', argsToUpdate: { email: 'test@test.com', age: 1337, colour: 'blue' }})