Как изменить значение атрибута в Grakn
В Grakn я хочу изменить значение name
атрибут, который прикреплен к entity
,
В данный момент я делаю это (см. Ниже), который просто удаляет атрибут, а затем вставляет новый в сущность страны.
match
$b isa country, has name "Old Name";
$a isa name;
$a val contains "Old Name";
delete $a;
insert
$b has name "New Name";
Я не могу найти документацию о том, как на самом деле редактировать только значение атрибута.
Какие-нибудь мысли?
2 ответа
На самом деле на данный момент, я не уверен, что вы можете... Я не нашел никакого решения, если вы делаете match
... insert
Вы добавите новый ресурс и вам нужно удалить старый. Это не будет обновлением. Я уверен, что это входит в новую функцию, хотя;)
не забудь commit
ваш delete
сделка. Все изменения в графе должны быть зафиксированы.
Главное, что важно понять в Grakn, - это то, что атрибуты с одинаковым типом и значением являются общими для владельцев.
Это означает, что удаление атрибута, принадлежащего определенной концепции, также удалит его для всех других концепций.
Вот несколько примеров:
Пример 1
insert $x isa company, has name "grakn";
insert $x isa website, has name "grakn";
Здесь мы вставили два понятия, которые имеют общее имя.
match $x isa company, has name $n; $n "grakn"; delete $n;
Теперь name
grakn
был удален, что означает, что он больше не существует в базе данных, поэтому в результате вы обнаружите, что он также был удален для веб-сайта.
Пример 2
insert $x isa company, has business-name "grakn", has company-number 01234;
insert $x isa company, has business-name "grakn", has company-number 56789;
insert $x isa website, has website-name "grakn";
В данном случае мы включили две разные компании, которые имеют общее название "grakn", и веб-сайт с названием "grakn".
match $x isa company, has business-name $n, has company-number 01234; $n "grakn"; delete $n;
В этом случае website-name
"grakn" не удаляется, но общее имя для компаний будет.
Пример 3 - вероятно, пример, который вы хотите
insert $x isa company, has name "grakn";
insert $x isa website, has name "grakn";
Как и в ex1, мы добавляем компанию и веб-сайт, которые имеют общий атрибут (поскольку тип и значение атрибута совпадают).
На этот раз мы хотим только удалить связь между атрибутом между компанией и атрибутом и оставить сайт без изменений:
match $x isa company, has name "grakn" via $r; delete $r;
Это находит отношения, $r
, то есть это фактическое закулисное соединение, которое связывает атрибут с его владельцем и удаляет его.
По сравнению с примером 1, в этом случае вы обнаружите, что веб-сайт сохраняет свое имя, поскольку сам атрибут не был удален, только одно из соединений с ним.
Решение
Для обновления атрибута требуется дополнительный шаг, потому что нам нужно добавить новый атрибут вместо того, который мы удаляем. При этом нам нужно убедиться, что мы ссылаемся на ту же компанию (экземпляр), из которой мы удалили имя (атрибут). В противном случае, как вы можете повторно найти компанию, название которой вы удалили, чтобы добавить новое имя?
Мы можем сделать это с match... insert
запрос, сопровождаемый insert
запрос:
match $x isa company, has name "grakn";
insert $x has name "new-name";
match $x isa company, has name "grakn" via $r; delete $r;