Jena Sparql only return 实例的直接超类
Jena Sparql only return direct superclass of instance
我在 Java 中使用 Jena,Pellet 作为推理机。现在我需要查询特定 URI 的 class,但问题是我事先不知道它是什么样的实例,在什么样的 class 层次结构中,所以我可以' 使用过滤器选项。使用时:
SELECT * WHERE {<" + uri + "> rdf:type ?x}
它return都是超级class。这个特定示例的层次结构如下所示:
-Thing
-Person
-Adult
-Animal
-Dog
每个 class 都有多个实例。我不知道我事先查询的是哪种实例。但是,例如,我正在查询类型为 Dog 的实例的 URI。它还将 return 动物和事物。但是我只想要return狗。那可能吗?仅使用 LIMIT 1 returns 直接超class.
有一种简单的方法可以使用 Jena 执行此操作,它提供了一个特殊的谓词来查询直接类型,因此您可以在您的代码中生成查询,如下所示:
"SELECT * { <" + ind + "> <" + ReasonerVocabulary.directRDFType + "> ?type }"
或者直接在查询中使用此谓词的 URI:
SELECT * { <ind> <urn:x-hp-direct-predicate:http_//www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type }
也可以编写一个相当低效但可移植的 SPARQL 查询来查询直接类型:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT * {
<ind> rdf:type ?directType .
FILTER NOT EXISTS {
<ind> rdf:type ?type .
?type rdfs:subClassOf ?directType .
FILTER NOT EXISTS {
?type owl:equivalentClass ?directType .
}
}
}
如果没有其他类型的个体是该类型的子class,则class是个体的直接类型。但是直接类型可能具有等效的 classes。为了处理这些情况,我们必须在查询中使用双重否定。该查询效率低下,因为它首先检索个体的所有类型并过滤不直接的类型。但从好的方面来说,您可以将它用于 Jena 以外不提供专用直接类型谓词的系统。
我在 Java 中使用 Jena,Pellet 作为推理机。现在我需要查询特定 URI 的 class,但问题是我事先不知道它是什么样的实例,在什么样的 class 层次结构中,所以我可以' 使用过滤器选项。使用时:
SELECT * WHERE {<" + uri + "> rdf:type ?x}
它return都是超级class。这个特定示例的层次结构如下所示:
-Thing
-Person
-Adult
-Animal
-Dog
每个 class 都有多个实例。我不知道我事先查询的是哪种实例。但是,例如,我正在查询类型为 Dog 的实例的 URI。它还将 return 动物和事物。但是我只想要return狗。那可能吗?仅使用 LIMIT 1 returns 直接超class.
有一种简单的方法可以使用 Jena 执行此操作,它提供了一个特殊的谓词来查询直接类型,因此您可以在您的代码中生成查询,如下所示:
"SELECT * { <" + ind + "> <" + ReasonerVocabulary.directRDFType + "> ?type }"
或者直接在查询中使用此谓词的 URI:
SELECT * { <ind> <urn:x-hp-direct-predicate:http_//www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type }
也可以编写一个相当低效但可移植的 SPARQL 查询来查询直接类型:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT * {
<ind> rdf:type ?directType .
FILTER NOT EXISTS {
<ind> rdf:type ?type .
?type rdfs:subClassOf ?directType .
FILTER NOT EXISTS {
?type owl:equivalentClass ?directType .
}
}
}
如果没有其他类型的个体是该类型的子class,则class是个体的直接类型。但是直接类型可能具有等效的 classes。为了处理这些情况,我们必须在查询中使用双重否定。该查询效率低下,因为它首先检索个体的所有类型并过滤不直接的类型。但从好的方面来说,您可以将它用于 Jena 以外不提供专用直接类型谓词的系统。