SPARQL:提供不同长度的备用路径

SPARQL: Provide alternate paths with differing lengths

我正在尝试 link 将一些本地数据与 DBpedia 结合起来,以提取有关国家/地区经济统计数据的信息。如何补偿不同长度的备用路径?该字段本身是 OPTIONAL,因此如果恰好没有列出语言,查询就不会遗漏结果,但我在 do[= 的资源上得到空白 language 列50=] 列出了语言。

例如,http://dbpedia.org/page/Netherlands, http://dbpedia.org/page/Ireland, and http://dbpedia.org/page/Italy 索引非常不同的语言,从字符串到引用资源的不同谓词:

荷兰:

爱尔兰:

意大利:

这是一个(精简的)示例查询,有点,但不是很好:

SELECT DISTINCT
?countryName
?dbEntry
(GROUP_CONCAT(DISTINCT ?dbLanguage; separator=", ") AS ?languages)

WHERE
{
    ?dbEntry a dbo:Place ;
        rdfs:label | dbo:longName ?countryName .


    # For some reason, stacking two OPTIONALs and BINDing is all that seems to work here, and still not 100%
    OPTIONAL {
        ?dbEntry dbo:language / foaf:name ?dbofLanguage .
        BIND(?dbofLanguage AS ?dbLanguage) .
    }

    OPTIONAL {
        ?dbEntry dbp:languages ?dbpLanguage .
        BIND(?dbpLanguage AS ?dbLanguage) .
    }
    FILTER (STR(?countryName) IN ("Netherlands", "Italy", "Ireland")) .
}
GROUP BY ?countryName ?dbEntry
LIMIT 3

DBpedia Link

您会看到返回的结果格式完全不同:

我想写点像

OPTIONAL {
    ?dbEntry (dbo:language / foaf:name) | (dbp:languages / rdfs:label) | dbp:languages ?language
}

但我认为 SPARQL 还不支持那么复杂的任何东西? (我得到零结果)

编辑以更正查询,已意识到您的问题...

SELECT DISTINCT                                                           ?countryName
                                                                          ?dbEntry
                ( GROUP_CONCAT ( DISTINCT ?language ; separator=", " ) AS ?languages )
WHERE
  {
        ?dbEntry a                                                              dbo:Place ;
                 rdfs:label | dbo:longName                                      ?countryName .
    OPTIONAL
      {
        ?dbEntry ( dbo:language / foaf:name ) | ( dbp:languages / rdfs:label ) | ( dbp:languages ) ?language
        FILTER isLiteral ( ?language )
      }
    FILTER ( STR ( ?countryName ) IN ( "Netherlands" , "Italy" , "Ireland" ) ) .
  }
GROUP BY ?countryName ?dbEntry

注意——这些属性(以及您的查询)将在下一个版本的 DBpedia 中发生巨大变化。例如,查看 current DBpedia Live page on Ireland


这似乎可以满足您的需求,只需多一点 Property Pathdbp:languages 之后 rdfs:label 上的 ? 运算符) --

SELECT DISTINCT                                                           ?countryName
                                                                          ?dbEntry
                ( GROUP_CONCAT ( DISTINCT ?language ; separator=", " ) AS ?languages )
WHERE
  {
        ?dbEntry a                                                              dbo:Place ;
                 rdfs:label | dbo:longName                                      ?countryName .
    OPTIONAL
      {
        ?dbEntry ( dbo:language / foaf:name ) | ( dbp:languages / rdfs:label? ) ?language
      }
    FILTER ( STR ( ?countryName ) IN ( "Netherlands" , "Italy" , "Ireland" ) ) .
  }
GROUP BY ?countryName ?dbEntry