Cypher neo4j的ON MATCH内的条件SET

时间:2018-06-14 10:43:27

标签: neo4j cypher

neo4j / cypher中的情况。

我有两个代表 person (标签)的节点,以及 friendship (label)节点之间的关系。友谊包含他们第一次见面,上次他们 遇到了,以及他们共同完成的事情。

如果节点不存在,我想添加节点,如果节点也不存在,也将它添加到数据库中。

  • 如果友谊不存在,我会创建它并添加他们一起做的活动以及他们第一次见面时的活动。
  • 如果友谊已经存在,我将活动添加到数组,如果它已经存在(我不想重复活动)。还更新他们上次遇到的时间。< / LI>

这是我想在密码中做的事情。我已经取得了大部分成功,但是我做错了。而且,如果我没弄错的话,就没有办法比较Cypher中的日期时间对象,所以我保存Unix time

bars.transform_window(window=[alt.WindowFieldDef(op='count', field='Sport:N', **{'as':'cardinality'})], frame=[None, None]) bars.transform_window(window=[alt.WindowFieldDef(op='rank', field='cardinality', **{'as':'rank'})], frame=[None, None], sort=[alt.WindowSortField(field='rank', order='descending')]) bars.transform_filter( ..... what??? .....)

在这里,我创造了不存在的东西。如果友谊存在与否会怎么样?

merge (p:Person {name:”Thomas”}) merge (p2:Person {name:”George”}) merge (p)-[r:FRIEND {}]-(p2)

on create set r.activities = [“eat”], r.firstMeet = 123456, r.lastMeet = 123456

当然是on match set r.activities = r.activities + “play” where not “play” in r.activities, r.lastMeet = 456789 where r.lastMeet < 456789 eatplay。可以在某个项目中输入123456,这是查询的示例。

问题在于,使用456789 where后{c} set问题导致我遇到问题。也许这不是正确的方式。我搜索了很多,包括这个网站,但没有找到可以提供帮助的东西。

1 个答案:

答案 0 :(得分:2)

这样的事情应该有效:

WITH timestamp() AS datetime
MERGE (p:Person {name: $p1Name})
MERGE (p2:Person {name: $p2Name})
MERGE (p)-[r:FRIEND]-(p2)
ON CREATE SET r.activities = ['eat'], r.firstMeet = datetime, r.lastMeet = datetime
ON MATCH SET
  r.activities = CASE WHEN $activity in r.activities
    THEN r.activities
    ELSE r.activities + $activity END,
  r.lastMeet = datetime;

我假设您传入parameters p1Namep2Nameactivity,并且可以使用当前的纪元时间(以毫秒为单位,由timestamp()函数生成的)为您的会议时间。