【问题标题】:SPARQL queries with relational operator使用关系运算符的 SPARQL 查询
【发布时间】:2014-08-21 11:07:17
【问题描述】:

我想对 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 查询 URL:http://dbpedia.org/sparql

【问题讨论】:

    标签: python nlp sparql dbpedia


    【解决方案1】:

    连接

    AND 很简单。如果你想说 X 通过属性 P 与 Y 相关,并且通过属性 Q 与 Z 相关,你只需包含两个三元组:

    X P Y .
    X Q Z .
    

    可以缩写:

    X P Y ; 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's query validator 进行测试。另请注意,您使用的是bif:contains,它提供了一个字符串包含函数,但SPARQL 1.1 实际上提供了一个您可以使用的contains 函数。它还提供了strstarts,您可以使用它来更有效地识别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
    

    SPARQL results

    【讨论】:

    • 您的 SPARQL 查询运行良好,我已了解 SPARQL 中的合取和析取逻辑。当我运行这个查询时,它花费了太多时间。我想减少 sparql 查询的执行时间。该怎么做?
    • 我很高兴听到它对您有用!您是在准确地运行我的查询,还是在运行其他不同的查询?无论如何,我认为这可能值得一个新的、单独的问题。
    • 谢谢先生的回复。该查询对“John”“Mary”运行良好,但如果我放置“Tom Cruise”“Akshay Kumar”而不是这些,则执行查询需要大约 5 秒的时间。为什么先生?
    • 我不知道这是否真的那么慢。毕竟,有很多数据需要考虑。改变过滤器表达式的顺序有帮助吗?
    • 是的,我知道,但我们有用于 dbpedia 数据的本地数据库。我们使用离线查询 dbpedia 数据库。尽管如此,这需要时间。如果您有任何解决方案,请分享给我。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 2020-08-28
    • 1970-01-01
    • 2016-08-02
    • 2019-11-20
    相关资源
    最近更新 更多