繁体   English   中英

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

[英]SPARQL Query for searching all properties of one type to match a string

我正在尝试构建一个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

我的查询有问题吗?

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

:SydneyLawford :middleName "Maleia"

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

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

所以这是最后的查询。 我把它分成两部分。 第一个将搜索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") . 
      }
    }
  } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM