如果在高流量中不存在,则重新分配在节点之间创建边缘
redisgraph create edge between nodes if not exist already in high traffic
我有以下密码查询。
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)
但是为此我从 redisgraph
中得到一个错误:
RedisGraph does not currently support map projection
如果两个节点之间不存在边缘,是否还有其他方法可以优化地创建边缘?我不能使用 MERGE
命令,因为当我必须创建新边时,我设置的 prop2
将是不同的值。
请注意,这应该可以在 redisgraph 中工作,如果它在 neo4j 或类似的东西上工作还不够。
请参阅 RedisGraph Merge docs 更具体 ON MATCH
和 ON CREATE
例如
MATCH (a:ACTOR {id: 'Charlie'}),
(m:MOVIE {id: 'TwoAndAHalfMen'})
MERGE (a)-[e:ACTED {prop1: val1}]->(m)
ON CREATE SET e.prop2 = 'cur-time'
我有以下密码查询。
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)
但是为此我从 redisgraph
中得到一个错误:
RedisGraph does not currently support map projection
如果两个节点之间不存在边缘,是否还有其他方法可以优化地创建边缘?我不能使用 MERGE
命令,因为当我必须创建新边时,我设置的 prop2
将是不同的值。
请注意,这应该可以在 redisgraph 中工作,如果它在 neo4j 或类似的东西上工作还不够。
请参阅 RedisGraph Merge docs 更具体 ON MATCH
和 ON CREATE
例如
MATCH (a:ACTOR {id: 'Charlie'}),
(m:MOVIE {id: 'TwoAndAHalfMen'})
MERGE (a)-[e:ACTED {prop1: val1}]->(m)
ON CREATE SET e.prop2 = 'cur-time'