2012-03-19 2 views

ответ

4

Интересный вопрос, поскольку он кажется достаточно простым и все же трудно правильно выразить запрос. William Greenly's answer не предоставляет то, что вы хотите, хотя он совершенно прав в своих объяснениях и правильно использует property path. Чтобы иметь возможность правильно запросить правильный запрос, который отвечает на ваш вопрос, следует предположить, что все списки хорошо сформированы (у них есть только один первый элемент, один - отдых, и они заканчиваются нулем).

Проблема в вашем запросе заключается в том, что он будет считать всех членов всех списков в наборе данных. Вам нужно что-то связать 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. Более того, списки обычно всегда связаны с другими объектами, так как не было бы смысла описывать список независимо от чего-либо еще.

+0

Спасибо Антуану, ты определил очень важный пункт списка, связанный с чем-то. Я не думал об этом, когда я пробовал запрос в наборе данных с одним списком в нем. – user1278577

3

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

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

rdf:first 
rdf:rest 
rdf:nil 

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

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

с помощью РДФ: ноль, чтобы указать что список больше не содержит больше элементов (так что это, по сути, список списков). Однако он также утверждает, что вы можете использовать RDF: первый interderterminantly следующим образом:

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

Точка ФРР: ноль это не указать, что список больше не имеет каких-либо предметов. Помните, что Semantic Web основан на предположениях Open World, поэтому, если иное не указано, вы не можете предположить, что в списке больше нет предметов просто потому, что они не известны или не указаны, следовательно, потребность в нем, 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, не предполагайте, что оно будет полным.

+0

спасибо William. – user1278577

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