2010-03-02 2 views
4

У меня есть файл RDF, используемый для отслеживания изменений элементов. Используя эти данные, я могу отслеживать изменения, внесенные в элемент за время его существования. После изменения конкретной информации соответствующие данные помещаются как новая ревизия. Посмотрите ..Запрос SPARQL для выбора/построения последней версии из данных RDF

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . 
@prefix mymeta: <http://www.mymeta.com/meta/> . 
@prefix dc: <http://purl.org/dc/elements/1.1/> . 

<urn:ITEMID:12345> rdf:type mymeta:item . 
<urn:ITEMID:12345> mymeta:itemchange <urn:ITEMID:12345:REV-1> . 
<urn:ITEMID:12345:REV-1> dc:title "Product original name"@en . 
<urn:ITEMID:12345:REV-1> dc:issued "2006-12-01"@en . 
<urn:ITEMID:12345:REV-1> dc:format "4 x 6 x 1 in"@en . 
<urn:ITEMID:12345:REV-1> dc:extent "200"@en . 

<urn:ITEMID:12345> rdf:type mymeta:item . 
<urn:ITEMID:12345> mymeta:itemchange <urn:ITEMID:12345:REV-2> . 
<urn:ITEMID:12345:REV-2> dc:title "Improved Product Name"@en . 
<urn:ITEMID:12345:REV-2> dc:issued "2007-06-01"@en . 

Согласно этим данным, произошел пересмотр пункт «2007-06-01», где только имя элемента было изменено на «Improved Наименование». Как вы можете видеть, «dc: format» и «dc: extent» отсутствуют в последней версии данных. Это необходимо, чтобы избежать миллионов дубликатов записей!

Я могу написать запрос SPARQL, который показывает мне последнюю информацию о версии продукта (REV-2: dc: title и dc: выпущен), но его отсутствующие «dc: format» и «dc: extent», которые я хочу, начиная с последней ревизии (REV-1).

Как я могу написать запрос SPARQL для этого? Любая помощь очень ценится!

+0

в 2010 году, когда этот вопрос был задан вопрос, это было бы довольно трудно, но новые дополнения в SPARQL 1.1 (выпущена в 2013 году, но с реализации различных уровни поддержки, ведущие к этому), это на самом деле не слишком сложно, когда используются подзапросы. –

ответ

2

Не знаете, что вы можете сделать это одним запросом. Я думаю, что больше на него, если я могу, но следующие два запроса могли бы получить работу в правильном направлении:

1) Найти изменения, которые не имеют формат

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX mymeta: <http://www.mymeta.com/meta/> 
PREFIX dc: <http://purl.org/dc/elements/1.1/> 

DESCRIBE ?change 
WHERE 
{ 
    ?item a mymeta:item; 
      mymeta:itemchange ?change. 
    ?change ?p ?o. 
    OPTIONAL 
    { 
     ?change dc:format ?format . 
    } 
    FILTER (!bound(?format)) 
} 

2) Я думаю, что это будет найти самое старое изменение, которое делает иметь формат

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX mymeta: <http://www.mymeta.com/meta/> 
PREFIX dc: <http://purl.org/dc/elements/1.1/> 

SELECT DISTINCT ?format 
WHERE { 
    ?item a mymeta:item; 
      mymeta:itemchange ?change. 
    ?change dc:format ?format; 
        dc:issued ?issued. 
    OPTIONAL { 
     ?moreRecentItem a mymeta:item; 
       ?moreRecentItem dc:issued ?moreRecentIssued. 
     FILTER (?moreRecentIssued > ?issued)} 
    FILTER (?bound (?moreRecentIssued)) 
} 

с некоторыми больше работы должно быть возможным ограничить? формат (2), чтобы быть от этих изменений с датой выпуска до данных выпуска результата из (1). Поэтому для каждой строки из (1) вы должны выполнить (2), чтобы найти значение формата для использования. У вас могут быть лучшие результаты, но если вы использовали механизм рассуждений на основе правил, а не SPARQL. Я бы рекомендовал EulerSharp или Pellet.

+0

Это было сложнее в 2010 году, когда задавался вопрос, но последняя версия SPARQL делает это намного проще. –

-1

Я реализовал это с помощью RDF Quads, сохраняя каждую ревизию внутри отдельного именованного графика и используя хорошо известный именованный график, чтобы отслеживать последнюю ревизию для каждого элемента вместе со всеми изменениями.

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

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

1

Для одного элемента это довольно простой запрос с использованием подзапросов SPARQL 1.1. Хитрость заключается в том, чтобы заказать изменения, которые имеют данное свойство, по их дате, и принять значение из последней версии. Форма values используется только для указания элементов, которые вы выбираете. Если вам нужно запросить дополнительные предметы, их можно добавить в блок values.

prefix mymeta: <http://www.mymeta.com/meta/> 
prefix dc: <http://purl.org/dc/elements/1.1/> 

select ?item ?title ?format ?extent where { 
    values ?item { <urn:ITEMID:12345> } 

    #-- Get the title by examining all the revisions that specify a title, 
    #-- ordering them by date, and taking the latest one. The same approach 
    #-- is used for the format and extent. 
    { select ?title { ?item mymeta:itemchange [ dc:title ?title ; dc:issued ?date ] . } 
    order by desc(?date) limit 1 } 

    { select ?format { ?item mymeta:itemchange [ dc:format ?format ; dc:issued ?date ] . } 
    order by desc(?date) limit 1 } 

    { select ?extent { ?item mymeta:itemchange [ dc:extent ?extent ; dc:issued ?date ] . } 
    order by desc(?date) limit 1 } 
} 
$ sparql --data data.n3 --query query.rq 
---------------------------------------------------------------------------------- 
| item    | title      | format   | extent | 
================================================================================== 
| <urn:ITEMID:12345> | "Improved Product Name"@en | "4 x 6 x 1 in"@en | "200"@en | 
---------------------------------------------------------------------------------- 

Если вы на самом деле нужно сделать это для всех детали, вы можете использовать другой подзапрос для выбора элементов. То есть, вместо values ?item { ... }, используйте:

{ select ?item { ?item a mymeta:item } } 

Хотя это не было упомянуто в оригинальный вопрос, это come up in the comments, если вы заинтересованы в получении самых последних значений свойств для всех свойств, вы можете подзапрос, как в следующем, который основан на How to limit SPARQL solution group size?

select ?item ?property ?value { 
    values ?item { <urn:ITEMID:12345> } 

    ?item mymeta:itemchange [ ?property ?value ; dc:issued ?date ] 

    #-- This subquery finds the earliest date for each property in 
    #-- the graph for each item. Then, outside the subquery, we 
    #-- retrieve the particular value associated with that date. 
    { 
    select ?property (max(?date_) as ?date) { 
     ?item mymeta:itemchange [ ?property [] ; dc:issued ?date_ ] 
    } 
    group by ?item ?property 
    } 
} 
--------------------------------------------------------------- 
| item    | property | value      | 
=============================================================== 
| <urn:ITEMID:12345> | dc:issued | "2007-06-01"@en   | 
| <urn:ITEMID:12345> | dc:title | "Improved Product Name"@en | 
| <urn:ITEMID:12345> | dc:extent | "200"@en     | 
| <urn:ITEMID:12345> | dc:format | "4 x 6 x 1 in"@en   | 
--------------------------------------------------------------- 
+0

Любые предложения о том, как это сделать без явного наложения предикатов 'dc: title',' dc: format' и 'dc: extent', поэтому все последние предикаты и объекты возвращаются для объектов ревизии? –

+0

@xn. Это было бы возможно, но я не думаю, что вы сможете иметь их все как отдельные столбцы; вы должны иметь их как отдельные строки. Все будет в порядке? –

+0

@xn. Я обновил ответ, чтобы вытащить самые последние значения для каждого свойства. –

Смежные вопросы