是否可以确定Cypher MERGE是创建还是匹配?

JnB*_*ymn 1 neo4j cypher

考虑Neo4J 2.0 Cypher查询

MERGE (u:User {id_str:"123"}) 
  ON CREATE SET
    u.name="Bob",
  ON MATCH SET
    u.phone_num="555-4152"
RETURN u
Run Code Online (Sandbox Code Playgroud)

这是一个愚蠢的查询-不用担心这里的意图。问题是,我如何理解此查询是创建还是仅找到一个节点?

更新

也许我应该进一步激励我为什么要这种行为。原因如下:如果该节点已经存在,则不必转到远程服务器(在我的情况下为Twitter API)并下载用户的所有元数据。如果ON CREATE可以以某种方式链接回回调以拉出此数据,那就太好了。这种行为在Cypher中似乎不太可能实现。因此,大概我想做的是一个匹配,如果获取返回NULL,那么我将调出Twitter API,获取元数据并进行创建。

jja*_*erg 5

我认为这与的意图背道而驰MERGE。您将使用它来描述查询执行后想要图形的外观,而不是查找图形之前的样子–读写操作在Cypher中应该严格分开。也就是说,您可以设置一个虚拟属性,如提到的@LameCoder:

MERGE (u:User {id_str:"123"}) 
  ON CREATE SET u.onCreate = true
WITH u, has(u.onCreate) as onCreate
REMOVE n.onCreate
RETURN u, u.onCreate
Run Code Online (Sandbox Code Playgroud)

(u), true如果创建则返回,(u), false如果没有创建则返回,并且没有副作用。或者,您可以维护时间戳记,也许一个用于创建节点,一个用于最后修改节点的时间戳记-我认为这是文档中的一个示例。这个

MERGE (u:User {id_str:"123"}) 
  ON CREATE SET u.created = timestamp()
  ON MATCH SET u.lastModified = timestamp()
RETURN u, has(u.lastModified) as onMerge
Run Code Online (Sandbox Code Playgroud)

与上面的查询类似。