【问题标题】:How to form SPARQL queries that refers to multiple resources如何形成引用多个资源的 SPARQL 查询
【发布时间】:2013-05-21 10:04:22
【问题描述】:

我的问题是my first question about SPARQL here 的后续问题。

我对 Mountain 对象的 SPARQL 查询结果是 here

从这些结果中,我选择了某个object resource。 现在我想为这个选定的 Mountain 对象获取“is dbpedia-owl:highestPlace of”记录的值。

也就是说,这座山是最高处的山脉的名称。

在我看来,这很复杂。不仅因为我不知道所需的语法,而且我在这里得到了两个对象。

  • 其中一个是Mont Blank Massif,它的类型是“place”。
  • 另一个是Western Alps,它的类型是“mountain range”——我想要的记录。

我需要上面的记录 #2 但不是 1。我知道 1 也是相关的,但有时它不遵循相同的模式。有时记录似乎是 YAGO 类型的,这可能会完全产生误导。为了安全起见,我只想在类型不匹配时丢弃这些记录。

如何形成我的 SPARQL 查询以获取这些“is dbpedia-owl:highestPlace of”记录并进行类型过滤?

【问题讨论】:

    标签: sparql wikipedia dbpedia


    【解决方案1】:

    您可以使用此查询,但请注意,您的示例中的 Mont_Blanc_massif 既是 dbpedia-owl:Place 又是 dbpedia-owl:MountainRange

    select * where {
       ?place dbpedia-owl:highestPlace :Mont_Blanc.
       ?place rdf:type dbpedia-owl:MountainRange.
    }
    

    run query

    评论后编辑:过滤
    目前还不清楚您要过滤什么(yago?),从技术上讲,您可以像这样过滤:

    select * where {
       ?place dbpedia-owl:highestPlace :Mont_Blanc.
       ?place rdf:type dbpedia-owl:MountainRange.
       FILTER NOT EXISTS { 
         ?place ?pred ?obj
         Filter (regex(?obj, "yago"))
       }
    }
    

    这会过滤掉在其 URL 中包含任何带有“yago”的object 的结果。

    【讨论】:

    • 谢谢,但我想阻止的不仅仅是 Yago。我想要任何不属于 Mountain Range 类的东西。
    • 第一个查询已经做到了。它包含 ONLY 类型为“山脉”的结果。
    • 不,它包含“勃朗峰地块”结果。如果您查看dbpedia.org/resource/Mont_Blanc_massif - 它是 Place 类型。另一方面,如果您查看其他三个(例如dbpedia.org/page/Graian_Alps) - 它是Mountain Range 类型。我想要那 3 个并且想要 Mont_Blanc_massif 出来。
    • 你到底指的是什么?如果您查看rdf:type,两者都是owl:Thing,两者都是dbpedia-owl:Placedbpedia-owl:NaturalPlace,并且两者都是 dbpedia-owl:MountainRange。它们都不是“规范的”或比另一个更重要。
    • 当您看到我提到的两个链接时,您会看到前者是“类型实体:地方”,而后者是“类型实体:山脉”。
    【解决方案2】:

    扩展上一个答案的结果,适当的查询将是

    select * where {
      ?mountain a dbpedia-owl:Mountain ;
                dbpedia-owl:abstract ?abstract ;
                foaf:depiction ?depiction .
      ?range a dbpedia-owl:MountainRange ;
             dbpedia-owl:highestPlace ?mountain .
      FILTER(langMatches(lang(?abstract),"EN"))
    }
    LIMIT 10
    

    SPARQL Results

    这会选择具有英语摘要的山脉,这些山脉至少有一个描述(否则模式将不匹配),并且有一些山脉,其中山脉是最高的地方。如果没有前面问题中的部分,如果您只想检索范围内最高位置的山脉,您可以使用如下查询:

    select * where {
      ?mountain a dbpedia-owl:Mountain .
      ?range a dbpedia-owl:MountainRange ;
             dbpedia-owl:highestPlace ?mountain .
    }
    LIMIT 10
    

    SPARQL results

    【讨论】:

    • 目前必须运行,稍后会更新。实际上,我在获取大多数山峰的范围时遇到了一些问题,需要进行更多调查……
    • 如果你看一下勃朗峰资源,有一个名为:“是 dbpedia-owl:highestPlace of”的属性——这就是我所需要的。它说勃朗峰是某个范围内的最高峰。我需要那个范围名称。外键之类的。只有当它是 Mountain Range 类型,而不是 Place 或 Thing 或类似的东西时,我才需要它。
    • 解释我之前的评论:我的问题是,在阅读Mont Blanc 页面时,我看到它“是 dbpedia-owl:highestPlace of dbpedia:Western_Alps ...”并且一直在用?mountain dbpedia-owl:highestPlace ?range。当然,这是倒退的。它必须是?range dbpedia-owl:highestPlace ?mountain
    • 是的,除了过滤部分之外,它几乎按照我想要的方式工作。看:dbpedia.org/page/Mont_Blanc_massif - 这是 Place 类型,而不是我真正想要的 MountainRange。能做到吗?
    • @NiravBhatt SPARQL 端点目前似乎已关闭,因此我现在无法测试其他查询。由于上面的查询包含?range a dbpedia-owl:MountainRange 模式,因此您返回的所有?ranges 都是dbpedia-owl:MountainRanges。另外,MountainRangeNaturalPlace 的子类,我期望NaturalPlacePlace 的子类,所以每个MountainRange 也是Place。如果你不想要Places,你就不能有任何MountainRanges。
    猜你喜欢
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多