PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX my: <http://www.ex.com#>
SELECT distinct ?person ?nationality
WHERE{
?person rdf:type ?p.
?person my:Nationality ?nationality.
filter (?nationality = "Some nationality")
}
我在Protege中创建了一个描述音乐制作公司的本体。我无法理解SPARQL查询及其工作方式。
一些解释
?person
:我要输出人物的变量。他们是Protege的个人
?nationality
我要输出国籍的变量。他们是
Protege中的数据属性
Nationality
:数据属性,其中包含国籍/字符串,每个人都有一个
my
:我创建的前缀
这是如何工作的?person rdf:type ?p
以及如何选择正确的类型?它会自动运作吗?我不觉得我已经将?person
变量设置为类型Person变量(这是我创建的一个类,它将一个人描述为一个实体),即使它输出的确是我需要的结果
答案 0 :(得分:1)
这如何运作&#34;?person rdf:type?p&#34;以及如何选择合适的类型?我不觉得我已经将?person变量设置为类型Person变量(这是我创建的类,它将一个人描述为一个实体),即使它输出的确是我需要的结果。
它没有选择正确的类型。它选择 a 类型,任何类型(以及任何个人)。大概是你看到预期结果的原因是你的查询的第二部分:
?person my:Nationality ?nationality.
在您的数据中,只有个人拥有此属性,因此只有匹配完整查询才会匹配(即使其他人具有不同的类型)。
SPARQL的工作原理本质上是模式匹配。您为RDF图指定了模板,查询中的变量是&#34; hole&#34;在那个模板中。无论您的图形中哪个部分适合整个模板都会返回。
换句话说,您的查询会询问以下内容:&#34;给我所有同时具有和类型的国家&#34;。可能有许多类型的东西,但由于只有人有国籍,才会有人返回。
如果您愿意,您可以明确表示您只对Person类型的个人感兴趣,方法是将变量?p
替换为人员的类标识符,例如:
?person rdf:type my:Person.
?person my:Nationality ?nationality.