Python 使用关系运算符的SPARQL查询
我想在SPARQL查询中使用关系和/或运算符 此处查询:Python 使用关系运算符的SPARQL查询,python,nlp,sparql,dbpedia,Python,Nlp,Sparql,Dbpedia,我想在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 . { {
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查询URL:
而且很容易。如果您想说X通过属性P与Y相关,通过属性Q与Z相关,您只需包括两个三元组:
X P Y .
X Q Z .
可以缩写为:
xpy;
Q Z
现在,如果属性相同,那么你说X通过属性p与Y和Z相关,它变成:
X P Y ;
P Z .
SPARQL为此提供了一个简写(它与RDF的Turtle序列化共享):
析取
或者更复杂一点,但你已经展示了一种方法。如果要说X与Y或Z相关,可以执行以下操作:
{ X P Y } UNION { X P Z }
SPARQL 1.1包括值
,这可以使它更简单一些:
VALUES ?xpValue { Y Z }
X P ?xpValue
更新您的查询
您的查询实际上不是合法的SPARQL 1.1(或SPARQL),即使Virtuoso(DBpedia运行的端点)接受它。你可以用它来测试。还要注意,您使用的是bif:contains
,它提供了一个字符串包含函数,但SPARQL 1.1实际上提供了一个您可以使用的函数。它还提供了可以更有效地识别freebase链接的工具。它还提供,这是检查字符串的语言标记的正确方法。使用这些,我将像下面这样重写您的查询,它将查找名称包含“John”或“Mary”的资源。(对于本例,限制仅限于保持结果简短。)
您的SPARQL查询运行良好,我已经理解SPARQL中的连接和分离逻辑。当我运行此查询时,它占用了太多的时间。我想减少sparql查询的执行时间。怎么做?我很高兴听到它对你有用!你是在精确地运行我的查询,还是其他什么?无论如何,我认为这可能值得提出一个新的、单独的问题。谢谢主席先生的答复。“John”“Mary”的查询运行良好,但如果我将“Tom Cruise”“Akshay Kumar”改为“Tom Cruise”,则执行查询需要花费5秒左右的时间。为什么,先生?我不知道这是否真的那么慢。毕竟还有很多数据要考虑。更改过滤器表达式的顺序有帮助吗?是的,我知道,但是我们有用于dbpedia数据的本地数据库。我们正在使用脱机查询dbpedia数据库。尽管如此,这需要时间。如果您有任何解决方案,请与我分享。谢谢你的帮助。
VALUES ?xpValue { Y Z }
X P ?xpValue
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