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

String 用于搜索一种类型的所有属性以匹配字符串的SPARQL查询,string,search,filter,match,sparql,String,Search,Filter,Match,Sparql,我试图构造一个SPARQL查询来搜索一个类型的所有属性。例如,我想搜索Person类型()并返回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/XMLSch

我试图构造一个SPARQL查询来搜索一个类型的所有属性。例如,我想搜索Person类型()并返回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")) .
            } .
    }
} 
前缀rdfs:
前缀用户界面:
前缀xsd:
选择*
在哪里{
图表{
?受试者a;
?财产?价值。
过滤器存在{
?主体?任何财产?任何价值。
过滤器(isLiteral(?anyValue)和®ex(xsd:string(?anyValue),“1956”,“i”))。
} .
}
} 
上面的查询会返回以下结果:

这在匹配属性生日和返回的3个实例时是正确的。但当我搜索“male”并希望返回所有匹配到male的Person实例时,我并没有得到我所期望的结果

质疑

前缀rdfs:
前缀用户界面:
前缀xsd:
选择*
在哪里{
图表{
?受试者a;
?财产?价值。
过滤器存在{
?主体?任何财产?任何价值。
过滤器(isLiteral(?anyValue)和®ex(xsd:string(?anyValue),“male”,“i”))。
} .
}
} 


我的查询有什么地方做错了吗?

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

:SydneyLawford :middleName "Maleia"
“Maleia”
当然匹配
“male”
(因为匹配不区分大小写)。如果希望值的字符串
为“male”
,请尝试稍微不同的
过滤器

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

这是最后一个查询。我把它分成两部分。第一个将搜索Person类型的所有属性值。第二部分获取值中对象的rdfs:label。举个例子,属性值的标签是女性。查询将与此匹配。这两个结果将在最后合并

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") . 
      }
    }
  } 
前缀rdfs:
前缀用户界面:
选择不同的主题
在哪里{
{
图表{
?受试者a。
?主体?财产?价值。
过滤器(isLiteral(?value)和正则表达式(str(?value),“1956”,“i”))。
}
}
联合
{
图表{
?受试者a。
?主体?财产?价值。
?属性rdfs:标签?属性名称。
?值rdfs:标签?值名称。
过滤器正则表达式(?valueName,“女性”)。
}
}
} 

在肯尼迪本体论中,性别是一个对象属性。它的值是资源而不是文本。因此,查询必须在对象标签上搜索。我也把答案贴在这里了。谢谢您的帮助OK,但您最初的查询也使用了
isLiteral
。删除它非常简单,只需使用
lcase(str(?anyValue))=“male”
。由于1956年
1956年
中没有任何内容实际上是正则表达式,因此可以使用
contains(str(?value),“1956”)
检查,而不调用正则表达式匹配器。您还可以显著简化此查询,例如。
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") . 
      }
    }
  }