use*_*577 7 rdf semantic-web sparql
这是获取rdf:list中项目数的正确/最佳SPARQL查询:
select(COUNT(?a)AS?count){?a http://www.w3.org/1999/02/22-rdf-syntax-ns#first?c }
在此先感谢您的帮助.
问候,拉胡尔
有趣的问题,因为它看起来很简单,但很难正确表达查询。威廉格林利的答案没有提供你想要的,尽管他的解释完全正确并且正确地使用了财产路径。为了能够正确地提出正确的查询来回答您的问题,必须假设所有列表都格式良好(它们只有一个第一个元素,一个其余元素,并且以 nil 结尾)。
您的查询中的问题是它将计算数据集中所有列表的所有成员。您需要一些东西来将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
}
Run Code Online (Sandbox Code Playgroud)
但列表通常不是由 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 .
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果您只是这样做:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT (COUNT(?member) AS ?count)
WHERE {
?list rdf:rest*/rdf:first ?member .
}
Run Code Online (Sandbox Code Playgroud)
您将添加列表和子列表的所有大小。现在,如果您没有可以附加列表的谓词并且没有 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 .
}
Run Code Online (Sandbox Code Playgroud)
这意味着我们想要找到连接到列表的东西,但不与谓词连接rdf:rest。原则上,如果实体本身不是列表并且谓词不是,则只有列表的开头通过谓词连接到某个其他实体rdf:rest。此外,列表通常总是以某种方式连接到其他实体,因为独立于其他实体来描述列表是没有意义的。