我想基于数据类型为float和string的注释来查询我的本体。例如,我有一个人有一个float类型的注释"EBC_value"和一个String类型的注释"Label"。
我该怎么做?我试过用REGEX,像这样,但它不起作用。我没有任何错误,只是没有结果。
PREFIX ont: <http://vestbrygg.no/ontologies/beer.owl#>
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#>
SELECT ?title
WHERE { ?x ont:title ?title
FILTER regex(?title, "Sack")
}
希望你们能帮忙。谢谢。是的,除非你想查看和测试整个本体,注释的代码如下:
<NamedIndividual rdf:about="&beer;Base_malt_-_Best_Malz">
<rdf:type rdf:resource="&beer;Light"/>
<beer:EBC_value rdf:datatype="&xsd;float"></beer:EBC_value>
<beer:Label rdf:datatype="&xsd;string">Sack</beer:Label>
</NamedIndividual>
您的查询与您的数据无关,这就是为什么您没有得到结果的原因。
首先,查询引用的ont:title
属性似乎不存在于数据中。
其次,您的名称空间似乎没有对齐,我假设查询中的ont
名称空间应该与RDF/XML中的beer
名称空间相同,但您没有显示名称空间,所以我只能猜测这一点。尽管名称空间大多是一种方便的机制,但最好与前缀的使用保持一致,因为这会减少混乱。
第三,绝对不需要使用REGEX()
,只需要使用适当的图形模式:
PREFIX beer: <http://vestbrygg.no/ontologies/beer.owl#>
SELECT ?x
WHERE
{
?x beer:Label "Sack" .
}
由于beer:Label
是一个属性,您可以在查询中直接访问它。这将为您找到beer:Label
属性值为Sack
的所有个人,如果您想在搜索字符串上进行部分匹配,您可以始终使用比REGEX()
:更快的CONTAINS()
函数
PREFIX beer: <http://vestbrygg.no/ontologies/beer.owl#>
SELECT ?x
WHERE
{
?x beer:Label ?label .
FILTER(CONTAINS(?label, "Sack"))
}
这将查找存在beer:Label
并且包含值Sack
的所有个人
编辑
为了回答您的评论,匹配键入的值需要您知道值的类型,假设您使用的是xsd:float
,那么您将查询如下:
PREFIX beer: <http://vestbrygg.no/ontologies/beer.owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?x
WHERE
{
?x beer:EBC_value "4.8"^^xsd:float .
}