我需要能够在neo4j中创建或更新节点。我正在使用节点js。
我正在尝试使用参数来实现这一目标。
我需要构建一个cypher查询,如...
MERGE (user:Person:User {email: {props}.email} )
ON CREATE user = {props} SET user.created = timestamp()
ON MATCH SET user.lastSeen = timestamp()
RETURN user'
我有一个由查询参数构建的节点..
node={props:{name:'shekar',email:'shekar@abc.com',age:10}}
如何构建密码查询?
我正在尝试像这样构建密码..
cypherQuery='MERGE (user:Person:User {email: ' + node.props.email + '})
ON CREATE user = ' + node.props + ' SET user.created = timestamp()
ON MATCH SET user.lastSeen = timestamp()
RETURN user';
我收到此错误:
errorError: Invalid input '@': expected an identifier character, node labels, a property map, a relationship pattern, '(', '.', '[', "=~", IN, IS, '*', '/', '%', '^', '+', '-', '<', '>', "<=", ">=", '=', "<>", "!=", AND, XOR, OR, ',' or '}' (line 1, column 40)
"MERGE (user:Person:User {email: ctippur@abc.com}) ON CREATE user = [object Object] SET user.created = timestamp() ON MATCH SET user.lastSeen = timestamp() RETURN user"
答案 0 :(得分:3)
首先不要这样做。
Cypher完全支持用作查询一部分的命名parameters。然后将参数值作为map / json-object传递给查询执行。
就像你在问题的第一部分中使用的一样。不知道为什么你在问题的第二部分放弃了这个?
cypherQuery='
MERGE (user:Person:User {email: {props}.email})
ON CREATE SET user = {props}, user.created = timestamp()
ON MATCH SET user.lastSeen = timestamp()
RETURN user';
params = {props: {email: "foo@bar.com", name:"A name"}}
答案 1 :(得分:0)
您必须用双引号编写电子邮件,否则Cypher不会将其作为字符串:
... {email: "' + node.props.email + '"} ...
更多,正如您在此处的错误陈述中所见:
errorError:... ON CREATE user = [object Object] SET user.created = timestamp()ON MATCH SET user.lastSeen = timestamp()RETURN user“
您的用户也遇到了一些问题 - 它就在电子邮件之后,所以您现在还没有看到它。
我建议在将其传递给查询之前对其进行字符串化:
CREATE user = ' + (JSON.stringify(node.props) + '
同样在这里,查看报价。
作为一般方法,我建议看看Micheal Hunger的答案。
答案 2 :(得分:0)
Michael Hunger从参数处理的角度来看是正确的,但是你的具体问题是,当你在电子邮件地址中连接时,你没有用引号括起来 - 所以输入为{email:citippur@abc.com。 ..而不是{email:“citippur@abc.com”......