подсчет rdf: списка с использованием SPARQL - PullRequest
7 голосов
/ 19 марта 2012

Это правильный / лучший запрос SPARQL для получения количества элементов в rdf: list:

select (COUNT (? A) AS? Count), где {? A http://www.w3.org/1999/02/22-rdf-syntax-ns#first?c}

Заранее благодарим за помощь.

С уважением, Рахул

Ответы [ 2 ]

4 голосов
/ 19 марта 2012

Интересный вопрос, поскольку он кажется достаточно простым, но все же трудно правильно выразить запрос. Ответ Уильяма Гринли не дает того, что вы хотите, хотя он совершенно прав в своих объяснениях и правильно использует путь свойства . Чтобы правильно задать правильный запрос, отвечающий на ваш вопрос, необходимо предположить, что все списки правильно сформированы (у них только один первый элемент, один остаток и они заканчиваются нулем).

Проблема в вашем запросе состоит в том, что он будет считать всех членов всех списков в наборе данных. Вам нужно что-то связать rdf:first только с элементом одного списка.

Если у вас есть URI, идентифицирующий интересующий вас список, вы можете сделать следующее:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>  
PREFIX ex:  <http://www.example.org/#>
SELECT (COUNT(?member) AS ?count) 
WHERE {
  ex:uriOfTheList  rdf:rest*/rdf:first  ?member
}

Но часто списки не идентифицируются URI. В этом случае можно идентифицировать определенные списки, используя другие свойства. Например, представьте, что у вас есть свойство ex:listOfAuthors, вы можете сделать:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX ex:  <http://www.example.org/#>
SELECT (COUNT(?member) AS ?count) 
WHERE {
  ex:publication  ex:listOfAuthors  ?list .
  ?list  rdf:rest*/rdf:first  ?member .
}

Обратите внимание, что если вы просто сделаете:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT (COUNT(?member) AS ?count) 
WHERE {
  ?list  rdf:rest*/rdf:first  ?member .
}

вы сложите все размеры списков и подсписков . Теперь все усложняется, если у вас нет предикатов, к которым вы можете прикрепить список, и у вас нет URI, и, возможно, вы хотите получить счетчик для всех списков в каждом списке. Есть один способ, который должен работать:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT (COUNT(?c) AS ?count) 
WHERE {
  ?thing  !rdf:rest  ?list .
  ?list  rdf:rest*/rdf:first  ?member .
}

Это говорит о том, что мы хотим найти что-то, что соединяется со списком, но не с предикатом rdf:rest. В принципе, только начало списка связано через предикат с каким-либо другим объектом, если объект не является самим списком и предикат не является rdf:rest. Более того, списки обычно всегда так или иначе связаны с другими объектами, так как не было бы смысла описывать список независимо от чего-либо еще.

3 голосов
/ 19 марта 2012

Это действительно очень хороший вопрос, потому что это не очень простое решение.

Важные термины в списках RDF:

rdf:first 
rdf:rest 
rdf:nil

для списка из более чем одного элемента рекомендуется смоделировать его следующим образом:

a:a rdf:first a:b;
    rdf:rest [
       rdf:first a:c;
       rdf:rest rdf:nil.
    ].

использование rdf: nil для указания того, что в списке больше нет элементов (так что по сути это список списков). Тем не менее, в нем также говорится, что вы можете использовать rdf: first, как показано ниже:

a:a rdf:first a:b;
    rdf:first a:c;
    rdf:rest rdf:nil.

Смысл rdf: nil - указать, что в списке больше нет элементов. Помните, что семантическая сеть Web основана на предположениях об открытом мире, поэтому, если не указано иное, вы не можете предполагать, что в списке больше нет элементов просто потому, что они не известны или не указаны, отсюда и необходимость в человеке, rdf: nil.

К счастью, в приведенном выше примере для обоих запросов существует один запрос, основанный на процессоре, поддерживающем SPARQL 1.1.

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>  
SELECT (COUNT(?a) AS ?count) 
WHERE {?a rdf:first+ ?c}

помните, что если список не содержит rdf: nil, не думайте, что он полон.

...