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