如果在高流量中不存在,则 redisgraph 在节点之间创建边缘

问题描述

我有以下密码查询

MATCH (a:ACTOR {id: 'Charlie'})
MATCH (m:MOVIE {id: 'TwoAndAHalfMen'})
OPTIONAL MATCH (a)-[e:ACTED {prop1: val1}]->(m)
 WITH COUNT(e) AS c,a,m
 WHERE c=0 CREATE (a)-[:ACTED {prop1: val1,prop2: '<cur-time>' }]->(m)

我们有一个 actor 节点和一个 movie 节点。如果 actormovie 节点之间没有边,则应创建新边 ACTED,并带有一些边属性

上述查询在流量不大的空闲数据库中运行良好,通常在不到 1 毫秒内响应。但是,当有大量流量时,仅此特定查询就需要很长时间,大约为几秒。而其他查询完成得很好。

我怀疑缓慢的原因是 COUNT 函数试图获取所有节点,并且在不断写入时以某种方式延迟。我在这里可能是错的,只是做一个假设。

我不需要知道边的总数,我只想知道边是否存在。所以我尝试以不同的方式执行此查询

MATCH (a:ACTOR {id: 'Charlie'})
MATCH (m:MOVIE {id: 'TwoAndAHalfMen'})
WHERE NOT EXISTS(
  MATCH (a)-[e:ACTED {prop1: val1}]->(m)
) 
CREATE (a)-[:ACTED {prop1: val1,prop2: '<cur-time>' }]->(m)

但为此,我从 redisgraph 中得到一个错误

RedisGraph does not currently support map projection

如果两个节点不存在,是否还有其他方法可以在两个节点之间最佳地创建边缘?我无法使用 MERGE 命令,因为当我必须创建新边时,我设置的 prop2 将是不同的值。

请注意,这应该适用于 redisgraph,如果它适用于 neo4j 或其他类似工具,则这还不够。

解决方法

请更具体地查看 RedisGraph Merge docs ON MATCHON CREATE

例如

MATCH (a:ACTOR {id: 'Charlie'}),(m:MOVIE {id: 'TwoAndAHalfMen'}) 
MERGE (a)-[e:ACTED {prop1: val1}]->(m) 
ON CREATE SET e.prop2 = 'cur-time'