【问题标题】:SPARQL Query for searching all properties of one type to match a stringSPARQL 查询用于搜索一种类型的所有属性以匹配字符串
【发布时间】:2013-11-12 20:02:16
【问题描述】:

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

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

这在匹配属性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")) .
            } .
    }
} 

我的查询有什么问题吗?

【问题讨论】:

    标签: string search filter match sparql


    【解决方案1】:

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

    :SydneyLawford :middleName "Maleia"
    

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

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

    【讨论】:

    • 在kennedys本体中,gender是一个对象属性。它的值是资源而不是文字。因此查询必须在对象标签上进行搜索。我也在这里发布了答案。感谢您的帮助
    • 好的,但是您的原始查询也使用了isLiteral。删除它很容易,使用 just lcase(str(?anyValue)) = "male".
    【解决方案2】:

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

    【讨论】:

    • 由于1956 中的任何内容实际上都不是正则表达式,因此您可以使用contains(str(?value),"1956") 检查而不调用正则表达式匹配器。
    • 您也可以显着简化此查询,例如,pastebin.com/xSkpcBNR。
    猜你喜欢
    • 2023-03-08
    • 2018-08-02
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2019-04-14
    相关资源
    最近更新 更多