1

我有以下密码查询。

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节点。actor如果和movie节点之间没有边,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)

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

RedisGraph does not currently support map projection

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

请注意,这应该在 redisgraph 中有效,如果它适用于 neo4j 或类似的东西,则还不够。

4

1 回答 1

1

请更具体地查看RedisGraph 合并文档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'
于 2021-02-03T13:35:11.437 回答