如何构造cypher查询以在nodejs中传递参数

时间:2014-02-18 06:47:37

标签: parameters neo4j cypher

我需要能够在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"
  • 协噶尔

3 个答案:

答案 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”......