【问题标题】:Node reuse, instead of creating new ones?节点重用,而不是创建新节点?
【发布时间】:2019-04-14 22:42:26
【问题描述】:

我正在尝试以这样的方式创建 (action)->(state) 对,以便 if :

  • 动作存在,使用它,而不是创建新的
  • 状态存在,使用它,而不是创建新状态

并在单个查询中完成。

如果状态与以前的调用不同,我将创建新的操作节点。所以我最终得到了多个相同的动作节点。

    query =  "merge (:state {id:%s})-[:q {q:%s}]->(:action {id:%s})" % (state, 0, action)

我使用半径图。


唯一的方法是使用 3 个查询而不是 1 个来实现:

graph.query mem 'merge (:state {id:9})'
graph.query mem 'merge (:action {id:9})'
graph.query mem 'match (s:state), (a:action) where s.id = 9 and a.id = 9 create (s)-[:q {q:0.3}]->(a)' 

【问题讨论】:

    标签: cypher graph-databases redisgraph


    【解决方案1】:

    目前 RedisGraph 不支持混合使用 MATCH 和 MERGE 子句,因此除了像以前那样拆分查询之外,您没有太多选择, 一个建议是将这三个查询包装在 MULTI EXEC 中:

    MULTI
    graph.query mem 'merge (:state {id:9})'
    graph.query mem 'merge (:action {id:9})'
    graph.query mem 'match (s:state), (a:action) where s.id = 9 and a.id = 9 create (s)-[:q {q:0.3}]->(a)'
    EXEC
    

    这应该会加快速度, 一旦 MATCH 和 MERGE 可以混合使用,我们将更新 here

    【讨论】:

    • 如何从 python 内部执行多执行。在 RG 中是否有类似事务的东西,以便将这 3 个查询与同时运行的客户端分开?
    • redis_con = redis.Redis() redis_con.execute_command("MULTI") redis_con.execute_command("GRAPH.QUERY", mem, "merge (:state {id:9})") redis_con. execute_command("GRAPH.QUERY", mem, "merge (:action {id:9})") redis_con.execute_command("GRAPH.QUERY", mem, "match (s:state), (a:action) where s .id = 9 和 a.id = 9 创建 (s)-[:q {q:0.3}]->(a)") 结果 = redis_con.execute_command("EXEC")
    猜你喜欢
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 2018-01-26
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多