我希望将关系和/或运算符用于SPARQL查询。
在此查询:
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,它是一个名称。现在我想知道,如何使用关系和/或运算符同时使用多个地名。简而言之,如何在sparql中使用关系运算符。
执行sparql查询URL:http://dbpedia.org/sparql
发布于 2014-08-21 06:21:34
连合
而且很容易。如果您想说X与属性P的Y和属性Q的Z都相关,则只需包含两个三元组:
X P Y .
X Q Z .
可以缩写为:
X-P-Y;.
现在,如果属性是相同的,那么通过属性P表示X与Y和Z相关,它变成:
X P Y ;
P Z .
SPARQL提供了一个缩写(它与RDF的Turtle序列化共享):
X P Y, Z .
分离
或者说有点复杂,但你已经展示了一种方法。如果您想说X与Y或Z相关,您可以:
{ X P Y } UNION { X P Z }
SPARQL1.1包括VALUES
,它可以使这一点变得更简单:
VALUES ?xpValue { Y Z }
X P ?xpValue
更新查询
您的查询实际上不是合法的SPARQL1.1(或SPARQL),即使Virtuoso (运行DBpedia的端点)接受它。您可以使用Spamql.org的查询验证器进行测试。还请注意,您使用的是bif:contains
,它提供了一个字符串包含函数,但是SPARQL1.1实际上提供了一个可以使用的包含函数。它还提供了股股,您可以使用它来更有效地识别自由基链接。它还提供了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
https://stackoverflow.com/questions/25424787
复制相似问题