过滤注释 - SPARQL

时间:2013-11-20 16:20:46

标签: regex filter annotations sparql

我想根据数据类型为float和string的注释查询我的ontology。 例如,我有一个具有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>

1 个答案:

答案 0 :(得分:0)

您的查询与您的数据无关,这就是您没有结果的原因。

首先,您的查询引用的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的所有个体,如果要对搜索字符串进行部分匹配,则可以始终使用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 .
}