Повторное использование узла вместо создания новых? - PullRequest
1 голос
/ 15 апреля 2019

Я пытаюсь создать пару (действие) -> (состояние) таким образом, чтобы, если:

  • действие существует, используйте его вместо создания нового
  • состояние существует, используйте его вместо создания нового

и сделать это одним запросом.

Тот, который у меня есть, создает новый узел действия, если состояние отличается от предыдущих вызовов. В итоге я получаю несколько одинаковых узлов действия.

    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)' 

1 Ответ

2 голосов
/ 16 апреля 2019

В настоящее время 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 могут быть смешаны.

...