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
:变量。他们是被保护的个体
?nationality
是一个我想要输出国籍的变量。它们是Protege中的数据属性
Nationality
:数据属性,该属性将国籍作为字符串包含,并且每个人都有一个
我创建的my
:前缀
这是如何工作的?person rdf:type ?p
,它如何选择正确的类型?它会自动工作吗?我觉得我没有将?person
变量设置为Person变量类型(这是我创建的一个类,它将person描述为一个实体),尽管它输出的正是我需要的结果。
发布于 2018-05-25 09:54:11
是如何工作的"?person rdf: type ? p“,它如何选择正确的类型?我觉得我没有将Person变量设置为person变量类型(这是我创建的一个类,它将person描述为一个实体),尽管它输出的正是我需要的结果。
它没有选择正确的类型。它选择一种类型,任何类型(也包括任何个体)。假设您看到预期结果的原因是查询的第二部分:
?person my:Nationality ?nationality.
在您的数据中,只有person-person才具有此属性,因此只有他们会匹配完整的查询(即使存在其他具有不同类型的个人)。
SPARQL的工作原理本质上是模式匹配。您为RDF图指定了一个模板,查询中的变量就是该模板中的“孔”。图中适合整个模板的任何部分都会被返回。
换句话说,您的查询请求如下:“给我所有同时具有类型、和的元素一个国籍”。可能有很多东西都有类型,但因为只有人才有国籍,所以只有人才会返回。
如果需要,可以明确表示只对Person类型的个体感兴趣,方法是将变量?p
替换为Person的类标识符,例如:
?person rdf:type my:Person.
?person my:Nationality ?nationality.
https://stackoverflow.com/questions/50514152
复制相似问题