0

我正在尝试构建一个 SPARQL 查询来搜索一个类型的所有属性。例如,我想搜索 Person 类型 ( http://topbraid.org/examples/kennedys#Person ) 并返回其属性与输入字符串“ken”匹配的 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), "1956", "i")) .
            } .
    }
} 

上面的查询返回给我这个:

结果 1

这在匹配属性birthYear 并返回3 个实例时是正确的。但是当我搜索“男性”并想要返回与男性匹配的所有 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")) .
            } .
    }
} 

结果 2

我的查询有什么问题吗?

4

2 回答 2

2

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

:SydneyLawford :middleName "Maleia"

"Maleia"当然匹配"male"(因为匹配不区分大小写)。如果您希望该值"male"完全具有字符串,请尝试稍有不同filter

FILTER (isLiteral(?anyValue) && lcase(str(?anyValue)) = "male")
于 2013-11-12T22:58:57.810 回答
0

所以这是最后的查询。我把它分成两部分。第一个将搜索 Person 类型的所有属性值。第二部分获取值中对象的 rdfs:label。因此,一个示例是属性值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") . 
      }
    }
  } 
于 2013-11-13T15:36:20.087 回答