2014-02-18 28 views
0

我需要能够在neo4j中创建或更新节点。我正在使用节点js。如何在nodejs中构造传递参数的密码查询

我想用参数来完成这个。

我需要构造一个暗号查询作为..

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:'[email protected]',age:10}} 

如何构建CYPHER查询?

我想构建这样的暗号..

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: [email protected]}) ON CREATE user = [object Object] SET user.created = timestamp() ON MATCH SET user.lastSeen = timestamp() RETURN user" 
  • 协噶尔

回答

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答案。

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: "[email protected]", name:"A name"}} 
+0

整个Neo4j网站似乎最近都在改组。许多博客和SO帖子上的链接断开。 –

0

迈克尔饥饿是对从参数处理的角度,而是你的具体问题是什么,当你在级联的电子邮件地址,没有用引号包围 - 所以它被输入为{电子邮件:citippur @ abc.com ...而不是{email:“[email protected]”... ...