在注释滤波器 - SPARQL(Filter on annotation - SPARQL)

2019-10-19 01:07发布

我想查询我的本体论基础上使用float和字符串的数据类型注释。 比如我有一个具有float类型和String类型的注释“标签”的注释“EBC_value”的个人。

我该怎么做呢? 我曾尝试用正则表达式,像这样的,但它doesn't工作。 我不得到任何错误,只是没有结果。

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") 
        }

希望你们可以帮忙。 Thanks.And是啊,除非你想看到和测试整个本体,为注释代码是这样的:

<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>

Answer 1:

您的查询不承担任何关于你的数据这就是为什么你没有结果。

首先在ont:title ,你的查询引用没有出现在你的数据存在财产。

其次你的命名空间似乎不对齐,我假设ont在您的查询的命名空间应该是相同的命名空间的beer在你的RDF / XML命名空间,但你没有显示的命名空间,所以我可以在这个只能猜测。 尽管命名空间大多是一种方便的机制,最好是与您使用前缀一致的,因为它会让事情少了很多混乱。

第三,应该是完全没有必要使用REGEX()你只需要使用适当的图形格式:

PREFIX beer: <http://vestbrygg.no/ontologies/beer.owl#>

SELECT ?x
WHERE
{
  ?x beer:Label "Sack" .
}

由于beer:Label是一个属性,你可以在查询中直接访问它。 这将找到你在所有个人beer:Label属性的值为Sack ,如果你想要做搜索字符串部分匹配你可以随时使用CONTAINS()函数将快于REGEX()

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 .
}


文章来源: Filter on annotation - SPARQL