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