我正在尝试构建一个SPARQL查询来搜索某个类型的所有属性。例如,我想搜索Person类型(http://topbraid.org/examples/kennedys#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")) .
} .
}
}
以上查询将此返回给我:
在匹配属性birthYear并返回3个实例时这是正确的。但是当我搜索&#34;男性&#34;,并希望返回与男性匹配的所有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")) .
} .
}
}
我的查询是否有问题?
答案 0 :(得分:2)
你没有做错任何事。第二个结果令人惊讶的是什么?你正在做一个不区分大小写的正则表达式匹配,并且有三重
:SydneyLawford :middleName "Maleia"
"Maleia"
肯定与"male"
匹配(因为匹配不区分大小写)。如果您希望值完全包含字符串"male"
,请尝试稍微不同的filter
:
FILTER (isLiteral(?anyValue) && lcase(str(?anyValue)) = "male")
答案 1 :(得分:0)
所以这是最后的查询。我把它分成两部分。第一个将搜索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") .
}
}
}