String 用于搜索一种类型的所有属性以匹配字符串的SPARQL查询
我试图构造一个SPARQL查询来搜索一个类型的所有属性。例如,我想搜索Person类型()并返回Person实例,其中Person实例的属性与输入字符串“ken”匹配。这是我正在使用的当前查询: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
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") .
}
}
}