Обновление RDF в Triplestore

Я экспериментирую с Sesame и Virtuoso Triplestores. На данный момент я использую Sesame Java API для добавления данных RDF в оба хранилища Triplestore.

Мои RDF-данные представляют собой разные вещи, такие как видеоданные, пользовательские данные и т. д. На данный момент я могу добавить RDF видео (название, описание, местоположение и т. д.) в Triplestore.

Но как я могу обновить RDF в магазине?

Например, если я использую REST-интерфейс sesame и делаю запрос PUT с обновленным RDF, все в магазине сначала удаляется.

Когда я использую POST с обновленными данными (например, название видео изменилось), оба заголовка (старый и новый) сохраняются.

Как вы работаете с тройными магазинами? Может быть, я пропустил здесь что-то существенное.


РЕДАКТИРОВАТЬ:

Теперь я использую Context в Sesame и Graphs в Virtuoso для каждой записи RDF. Таким образом, для обновления я могу сначала очистить контекст и добавить его снова. Поскольку я использую Sesame API для обоих магазинов Triplestore (мы еще не знаем, какой из них будем использовать), код выглядит совершенно одинаково.

ValueFactory f = rep.getValueFactory();
URI uri = f.createURI(urn);
con.clear(uri);
con.add(reader,this.baseURI, RDFFormat.RDFXML,uri);

Спасибо за помощь


person mjspier    schedule 20.06.2011    source источник
comment
Обратите внимание, что документация поставщика Virtuoso Sesame содержит примеры добавления данных RDF в хранилище Quad: virtuoso.openlinksw.com/dataspace/dav/wiki/Main/   -  person hwilliams    schedule 21.06.2011
comment
@hwilliams. Да, я использовал это. Но я пока не знаю, как обновить RDF в магазине с помощью API.   -  person mjspier    schedule 21.06.2011
comment
Virtuoso имеет операцию изменения SPARUL, которая со встроенной операцией удаления и вставки выполняет эквивалент операции обновления SQL, как подробно описано в docs.openlinksw.com/virtuoso/   -  person hwilliams    schedule 21.06.2011


Ответы (2)


Я предполагаю, что вы работаете со SPARQL. Если нет, то, наверное, стоит :-)

Многие хранилища троек поддерживают SPARQL Update, язык для изменения троек RDF в хранилище SPARQL. Это как INSERT, UPDATE, DELETE в SQL и так далее. Я не уверен, поддерживает ли Sesame его — обновление SPARQL по-прежнему является очень новой спецификацией, которая еще даже не доработана.

Еще одна полезная вещь, о которой следует знать, особенно если вы хотите работать в режиме RESTful, это Именованные графики. Это позволяет управлять тройками на разных графиках, поэтому вы можете хранить данные отдельно. Например, вы можете хранить триплеты о каждом видео в отдельном именованном графике, а затем обновлять только этот именованный график по запросу PUT. Вы по-прежнему можете использовать SPARQL для запроса всего хранилища по всем именованным графикам. Опять же, я не совсем уверен, что REST API Sesame предоставляет доступ к именованным графикам. (Я почти уверен, что это делает API Java; я думаю, что они называют это как-то по-другому. Контексты?)

person cygri    schedule 20.06.2011
comment
спасибо за Ваш ответ. Все еще выясняю, как лучше для меня. SPARQL мне все равно придется использовать позже. Так что я попробую. - person mjspier; 20.06.2011
comment
Да Sesame вызывает контексты именованных графов - person RobV; 20.06.2011
comment
Еще раз спасибо за этот ответ. Не знал, что я могу использовать контекст или график для каждой записи rdf. Это было очень полезно. - person mjspier; 21.06.2011

Итак, взяв ваш конкретный пример заголовка, предполагая, что у вас есть исходный RDF, например:

:something :title "Original Title" .

И вы хотите изменить его на что-то вроде:

:something :title "Updated Title" .

Использование POST от Sesame только добавляет новую информацию к именованному графику (контекст в терминологии кунжута), что важно, оно не удаляет любую существующую информацию.

В терминах RDF эти две тройки представляют разные факты. Sesame (или любой другой триплстор, если уж на то пошло) не знает, что 2-й тройник должен заменить 1-й. Это сильно отличается от традиционной SQL/реляционной модели, к которой вы, возможно, привыкли, когда вы будете обновлять свойство, RDF не имеет правильного представления об этом, поскольку вы не можете изменить тройку как таковую. Вы можете добавить новые тройки или удалить существующие тройки.

Чтобы получить желаемое поведение обновления, вы должны удалить старую тройку (API-интерфейс Sesame REST поддерживает HTTP DELETE для этого), а затем добавить новую тройку, которая заменяет ее (используйте операцию POST Sesame, как вы это делаете сейчас).

То же самое относится практически к любому тройному магазину, который вы используете. Если, например, cyrgi предлагает вам использовать хранилище, поддерживающее обновление SPARQL, вы можете отправить следующее (предполагается, что вы используете именованные графы) в конечной точке обновления:

DELETE DATA 
{ 
  GRAPH <http://example.org/graph> { :something :title "Original Title" . }
};
INSERT DATA 
{
   GRAPH <http://example.org/graph> { :something :title "Updated Title" . }
}
person RobV    schedule 20.06.2011