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
您会看到返回的结果格式完全不同:
我想写点像
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 Path(dbp: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
我正在尝试 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
您会看到返回的结果格式完全不同:
我想写点像
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 Path(dbp: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