Python 使用关系运算符的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 . { {

我想在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,这是一个单一的名称。现在我想知道,我如何使用关系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