对注释进行筛选-SPARQL



我想基于数据类型为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 .
}

最新更新