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, например
- сначала сопоставьте узел, для которого вы хотите обновить метку
- затем удалите предыдущую метку для узла
- затем добавьте новую метку для узла
Примечание: узел здесь относится к вершине или ребру.
Например: если у нас есть узел с меткой «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
Этот запрос приведет к изменению метки узла с «Фильм» на «Серия», а его свойства останутся неизменными.