我想在SPARQL查询上使用关系AND / OR运算符。
在这里查询:
SELECT DISTINCT ?dbpedia_link str(?name) as ?label str(?label1) as ?label1 ?freebase_link WHERE {
?dbpedia_link rdfs:label ?label1 .
?dbpedia_link foaf:name ?name .
{
{ ?dbpedia_link rdf:type dbpedia-owl:Film .}
UNION
{ ?dbpedia_link rdf:type dbpedia-owl:Person .}
}
?dbpedia_link owl:sameAs ?freebase_link .
FILTER regex(?freebase_link, "^http://rdf.freebase.com") .
FILTER (lang(?label1) = 'en').
?name bif:contains "Akshay_Kumar" .
?dbpedia_link dcterms:subject ?sub
}
在此查询中,我使用了单个名称Akshay_Kumar。现在,我想要如何使用关系AND / OR运算符一次使用多个名称。简而言之,我们如何在sparql中使用关系运算符。
执行sparql查询网址:http ://dbpedia.org/sparql
AND很容易。如果要说X与属性P的Y以及Z与属性Q的Z都相关,则只需包含两个三元组:
X P Y .
X Q Z .
可以缩写为:
XPY; QZ。
现在,如果属性相同,那么您说X通过属性P与Y和Z相关,则变为:
X P Y ;
P Z .
SPARQL为此提供了一个简写(它与RDF的Turtle序列化共享):
X P Y, Z .
OR比较复杂,但是您已经展示了一种实现方法。如果你想说的是,X是与任何Y或Z,你可以这样做:
{ X P Y } UNION { X P Z }
SPARQL 1.1包含的功能VALUES
可以使此操作更简单:
VALUES ?xpValue { Y Z }
X P ?xpValue
您的查询实际上不是合法的SPARQL 1.1(或SPARQL),即使Virtuoso(DBpedia运行的端点)接受了该查询。您可以使用sparql.org的查询验证器进行测试。还要注意,您正在使用bif:contains
,它提供了一个字符串包含功能,但是SPARQL 1.1实际上提供了一个可以使用的包含功能。它还提供了strstart,您可以使用它们来更有效地识别freebase链接。它还提供了langMatches,这是检查字符串的语言标签的正确方法。使用这些,我将像下面这样重写您的查询,该查询查找名称包含“ John”或“ Mary”的资源。(此限制仅是为了使结果简短)。
select ?resource ?name ?label ?freebase where {
values ?type { dbpedia-owl:Film dbpedia-owl:Person }
values ?namePart { "John" "Mary" }
?resource rdfs:label ?label ;
foaf:name ?name ;
a ?type ;
owl:sameAs ?freebase .
filter ( langMatches( lang(?label), 'en' ) &&
strstarts(str(?freebase), "http://rdf.freebase.com" ) &&
contains( ?name, ?namePart ) )
}
limit 10
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句