Neo4j cypher检查之前是否已经喜欢过

时间:2014-10-07 18:13:52

标签: neo4j cypher

我使用以下用于状态更新的密码

MATCH (n:user {username: "pewpewlasers"})-[k :STATUSUPDATE|:NEXT*]->(o {address: "234cgdsfg23"})
MATCH (p:user {username: "userThatLikedMyStatus"})
CREATE (p)-[x:LIKES]->(o)
return x

然而,在喜欢这篇文章之前,我想检查用户是否已经喜欢这篇文章。是否可以在同一查询中检查?基本上,我想检查MATCH (p:user {username: "userThatLikedMyStatus"})-[:LIKES]->(o)

之前是否存在CREATE

编辑:我忘记了一个重要的细节。对不起。我通常有关于LIKES关系的时间戳信息。我的查询实际上是这样的:

MATCH (n:user {username: "pewpewlasers"})-[k :STATUSUPDATE|:NEXT*]->(o {address: "234cgdsfg23"})
MATCH (p:user {username: "userThatLikedMyStatus"})
CREATE (p)-[x:LIKES {date: "TIMESTAMP"}]->(o)
return x

TIMESTAMP值取决于帖子的喜欢时间。因此每次都会改变。由于每次都会更改,MERGE始终会创建新关系。如果MERGE存在CREATE,无论LIKES参数是什么,都有办法让date忽略{{1}}吗?

1 个答案:

答案 0 :(得分:2)

如果你不想在关系已经存在时做任何不同的事情,那么你可以使用Merge。

MATCH (n:user {username: "pewpewlasers"})-[k :STATUSUPDATE|:NEXT*]->(o {address: "234cgdsfg23"})
MATCH (p:user {username: "userThatLikedMyStatus"})
MERGE (p)-[x:LIKES]->(o)
return x

如果x不存在,现在就会存在。如果x确实存在,则不会创建新关系,并且将返回现有关系。如果要根据关系是否已存在执行任何操作,Merge命令还具有ON CREATE和ON MATCH语义。

编辑 - 合并并设置属性

不确定。假设您只想在初始创建关系时设置时间戳,那么您可以这样做。

MATCH (n:user {username: "pewpewlasers"})-[k :STATUSUPDATE|:NEXT*]->(o {address: "234cgdsfg23"})
MATCH (p:user {username: "userThatLikedMyStatus"})
MERGE (p)-[x:LIKES]->(o)
ON CREATE SET x.date = timestamp()
return x

因为Merge不包含date属性,所以任何现有LIKES关系(p和o之间)都将匹配且不创建任何关系。当然,如果不存在,将创建一个新的,此时您设置时间戳。