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

SPARQL:提供具有不同长度的备用路径,sparql,rdf,dbpedia,Sparql,Rdf,Dbpedia,我正在尝试将一些本地数据与DBpedia连接起来,以提取有关各国经济统计数据的信息。如何补偿具有不同长度的备用路径?字段本身是可选的,因此,如果查询碰巧没有列出语言,则不会错过结果,但我在列出语言的资源上会得到空白的语言列 例如,、和索引使用非常不同的语言,从字符串到引用资源的不同谓词: 荷兰: 爱尔兰: 意大利: 下面是一个(精简的)示例查询,这种查询很有效,但不是很好: SELECT DISTINCT ?countryName ?dbEntry (GROUP_CONCAT(DISTIN

我正在尝试将一些本地数据与DBpedia连接起来,以提取有关各国经济统计数据的信息。如何补偿具有不同长度的备用路径?字段本身是
可选的
,因此,如果查询碰巧没有列出语言,则不会错过结果,但我在列出语言的资源上会得到空白的
语言

例如,、和索引使用非常不同的语言,从字符串到引用资源的不同谓词:

荷兰:

爱尔兰:

意大利:

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

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

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

我想写一些像这样的东西

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中,这些属性(以及您的查询)将发生巨大的变化。例如,请查看


这似乎满足了您的需要,只需要多一点(在
rdfs:label
后面的
dbp:languages
上的
操作符)--


您的属性路径有效,它只是Virtuoso的anytime功能,返回在给定时间内可以计算的内容。您应该使用更好的过滤器进行调试,即使用
VALUES?dbEntry{dbr:荷兰dbr:Italy dbr:Ireland}
而不是过于昂贵的
过滤器。您还应该将您的
?countryName
仅限于英语,否则您将获得国家标签中每种语言的多行。
选择DISTINCT?countryName?条目(GROUP_CONCAT(DISTINCT?language;separator=“,”)AS?languages),其中{VALUES?条目{dbr:荷兰dbr:意大利dbr:爱尔兰}?dbEntry a dbo:Place;rdfs:label | dbo:longName?countryName.filter(lang(?countryName)='en')#出于某种原因,堆叠两个选项和绑定在这里似乎是唯一可行的,但仍然不是100%可选的{?dbEntry(dbo:language/foaf:name)|(dbp:languages/rdfs:label)| dbp:languages?language}GROUP BY?countryName?dbEntry LIMIT 10
由于意大利有多个英文名称,因此这里还有两行。我只需要按URI分组,然后在名称上使用
group\u concat
,或者使用
sample
只获得一个名称。@AKSW啊,我听说过。我会使用
,但这实际上只是一个简短的查询-我在
服务
块中使用它来匹配我自己的数据。如果我试图匹配local和DBpedia的
WHERE
子句中的
?countryName
变量,它永远不会匹配-我认为这是语言问题。我可以在查询中对我自己的数据指定
@en
吗?你可以直接在文本上使用它,例如
“意大利”@en
,但是只需在(…)
中使用
过滤器(?countryName),所以不再需要
STR
函数哦,天哪,我甚至没有意识到DBpedia正在进行更新!我只与SPARQL合作了2-3周,哈哈。你的提问确实奏效了!我认为结合@AKSW关于Virtuoso的anytime功能的注释可以解释很多事情。@JoshToth当前在DBpedia.org/sparql加载的DBpedia数据集是2016年10月的转储。(我的意思是,美国总统仍然是奥巴马,2016年之后就没有电影了)。。。从那时起,就再也没有人加载新的转储文件,但这将在不久的将来发生。也就是说,dbpedialive端点总是(几乎)与维基百科的数据同步。@AKSW我在一个查询中看到了奥巴马的事情。。。这是有道理的,哈。
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