Apache AGE — изменение меток узлов и ребер

Есть ли способ изменить текущую метку вершины или ребра? Например, если я создаю граф для хранения фильмов и сериалов, а затем создаю следующую вершину:

      SELECT * FROM cypher ('visual_arts', $$
CREATE (v:Movie {title: "The Last of Us", episodes: 4, seasons: 1, main_actors: ["Pedro Pascal", "Bella Ramsey"]})
RETURN v $$) as (v agtype);

И затем я хочу исправить эту вершину, изменив метку на «Сериал» вместо «Фильм». Как мне это сделать?

5 ответов

В текущей версии AGE мы не можем обновить метку какой-либо вершины или ребра.

Для этого лучше всего ввести новое свойство UpdatedLabel и установить для него значение Series. Вы можете сделать это:

      SELECT * FROM cypher('visual_arts', $$
MATCH (v:Movie)
SET v.UpdatedLabel = "Series" RETURN v
$$) as (v agtype);

Теперь вы можете получить серию, используя:

      SELECT * FROM cypher('visual_arts', $$
MATCH (v:Movie)
where v.UpdatedLabel = "Series" RETURN v
$$) as (v agtype);

К сожалению, у нас нет функции метки обновления в Apache-age, но скоро она появится.

Скорее всего, он будет работать по тому же шаблону, что и в шифрованных запросах в Neo4j, например

  1. сначала сопоставьте узел, для которого вы хотите обновить метку
  2. затем удалите предыдущую метку для узла
  3. затем добавьте новую метку для узла

Примечание: узел здесь относится к вершине или ребру.

Например: если у нас есть узел с меткой «Engine» и мы хотим обновить его до «EnginePower», то следующим образом мы можем сделать это в cypher Neo4j.

      MATCH (c:Car)-[r]-(e:Engine)
REMOVE e:Engine
SET e:EnginePower
RETURN e

Для того же, если мы хотим добавить функциональность в apache-age, это может быть что-то следующим образом

      SELECT * FROM cypher('graph_name', $$
MATCH (c:Car)-[r]-(e:Engine)
REMOVE e:Engine 
SET e:EnginePower 
RETURN e
$$) as (e agtype);

Я считаю, что эта функция в настоящее время находится в разработке прямо сейчас. См. https://github.com/apache/age/issues/464 .

Поскольку в настоящее время существует AGE, невозможно напрямую изменить метку вершины или ребра после их создания, поскольку они неизменяемы по определению.

Возможный обходной путь — создать новый узел с правильной меткой и скопировать соответствующие свойства из существующего узла. Что-то вроде:

      MATCH (m:Movie {title: "The Last of Us"})
CREATE (s:Series)
SET s = m
REMOVE m:Movie
RETURN s

Вы можете использовать следующий запрос для маркировки узлов и ребер:

      MATCH (v:Movie {title: "The Last of Us"})
SET v:Series
DELETE v:Movie

Этот запрос приведет к изменению метки узла с «Фильм» на «Серия», а его свойства останутся неизменными.

Другие вопросы по тегам