SPARQL查询用于搜索一种类型的所有属性以匹配字符串

时间:2013-11-12 20:02:17

标签: string search filter match sparql

我正在尝试构建一个SPARQL查询来搜索某个类型的所有属性。例如,我想搜索Person类型(http://topbraid.org/examples/kennedys#Person)并返回其属性与输入字符串匹配的Person实例" ken"。这是我目前使用的查询:

PREFIX rdfs:   <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX ui:    <http://uispin.org/ui#>
PREFIX xsd:  <http://www.w3.org/2001/XMLSchema#>

SELECT * 
WHERE {
    GRAPH <http://topbraid.org/examples/kennedys> {
        ?subject a <http://topbraid.org/examples/kennedys#Person>;
                    ?property ?value . 

        FILTER EXISTS {
                        ?subject ?anyProperty ?anyValue .
                        FILTER (isLiteral(?anyValue) && regex(xsd:string(?anyValue), "1956", "i")) .
            } .
    }
} 

以上查询将此返回给我:

Result 1

在匹配属性birthYear并返回3个实例时这是正确的。但是当我搜索&#34;男性&#34;,并希望返回与男性匹配的所有Person实例时,我不能达到我的预期。

查询

PREFIX rdfs:   <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX ui:    <http://uispin.org/ui#>
PREFIX xsd:  <http://www.w3.org/2001/XMLSchema#>

SELECT * 
WHERE {
    GRAPH <http://topbraid.org/examples/kennedys> {
        ?subject a <http://topbraid.org/examples/kennedys#Person>;
                    ?property ?value . 

        FILTER EXISTS {
                        ?subject ?anyProperty ?anyValue .
                        FILTER (isLiteral(?anyValue) && regex(xsd:string(?anyValue), "male", "i")) .
            } .
    }
} 

Result 2

我的查询是否有问题?

2 个答案:

答案 0 :(得分:2)

你没有做错任何事。第二个结果令人惊讶的是什么?你正在做一个不区分大小写的正则表达式匹配,并且有三重

:SydneyLawford :middleName "Maleia"

"Maleia"肯定与"male"匹配(因为匹配不区分大小写)。如果您希望值完全包含字符串"male",请尝试稍微不同的filter

FILTER (isLiteral(?anyValue) && lcase(str(?anyValue)) = "male")

答案 1 :(得分:0)

所以这是最后的查询。我把它分成两部分。第一个将搜索Person类型的所有属性值。第二部分获取值中对象的rdfs:标签。因此,一个例子是属性值http://topbraid.org/examples/kennedys#female将标签为女性。该查询将与该匹配。这两个结果将在最后结合起来。

PREFIX rdfs:   <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX ui:    <http://uispin.org/ui#>


SELECT distinct ?subject  
  WHERE {
    {
      GRAPH <http://topbraid.org/examples/kennedys> {

        ?subject a <http://topbraid.org/examples/kennedys#Person> . 

        ?subject ?property ?value .

        FILTER (isLiteral(?value) && regex(str(?value), "1956", "i")) .
      }
    }
    UNION
    {
      GRAPH <http://topbraid.org/examples/kennedys> {

        ?subject a <http://topbraid.org/examples/kennedys#Person> . 

        ?subject ?property ?value .

        ?property rdfs:label ?propertyName . 
        ?value rdfs:label ?valueName . 

        FILTER regex(?valueName, "female") . 
      }
    }
  }