Интересный вопрос, поскольку он кажется достаточно простым и все же трудно правильно выразить запрос. 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
. Более того, списки обычно всегда связаны с другими объектами, так как не было бы смысла описывать список независимо от чего-либо еще.
Спасибо Антуану, ты определил очень важный пункт списка, связанный с чем-то. Я не думал об этом, когда я пробовал запрос в наборе данных с одним списком в нем. – user1278577