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

问题描述 投票:0回答:1

我正在尝试将一些本地数据与DBpedia关联起来,以提取有关国家经济统计数据的信息。如何补偿长度不同的替代路径?字段本身为OPTIONAL,因此如果查询恰好没有列出语言,则查询不会错过任何结果,但是在do列出了语言的资源上,我得到了空白的language列。

例如,http://dbpedia.org/page/Netherlandshttp://dbpedia.org/page/Irelandhttp://dbpedia.org/page/Italy对所讲语言的索引非常不同,从字符串到引用资源的不同谓词:

荷兰:

“荷兰语言屏幕截图”“ >>

爱尔兰:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9haWJZci5wbmcifQ==” alt =“爱尔兰语言截图”>“ >>

意大利:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS81OTNaNS5wbmcifQ==” alt =“意大利语言截图”>“>

这是一个(精简的)示例查询,种类

有效,但效果不佳:
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

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

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9hMFdpci5wbmcifQ==” alt =“ DBpedia结果屏幕截图”>

我想写类似的东西

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

但是我认为SPARQL还不支持任何复杂的功能吗? (我得到零结果)

我正在尝试将一些本地数据与DBpedia关联起来,以提取有关国家经济统计数据的信息。如何补偿长度不同的替代路径?该字段本身是可选的...

已修改为正确查询,已经意识到您的问题...

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 Path?之后的rdfs:label上的dbp:languages运算符)-

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

  • live results
  • sparql rdf dbpedia
    1个回答
    0
    投票

    已修改为正确查询,已经意识到您的问题...

    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
    
    © www.soinside.com 2019 - 2024. All rights reserved.