带有语言过滤器的 SPARQL 查询模板
SPARQL query template with language filters
我是 SPARQL 的新手,我正在尝试为由我的查询模板 return 编辑的文字插入某种语言过滤器。
问题是数据集没有提供结构良好的标记系统,所以我必须以某种条件方式限制结果,并使这些条件适用于以下模板:
SELECT distinct ?s ?p ?o WHERE {
?this :is :something. // this pattern is passed as argument
// to the js func that manage the
// query
{
bind(?this as ?s)
?s ?p ?o.
// here i putted my filters
}
}
我想添加的过滤器应该提供一种方法 return 只有 "english version" 用于带有文字的模式。如果未提供英文版本,则 return 未标记的版本 - 始终存在未标记的版本。
根据类似问题的解决方案,我尝试了这个:
filter(!isLiteral(?o) || (langMatches(lang(?o), 'en')) || lang(?o)='')
但是 - 当然 - 最终 return 两者兼而有之:英语和未标记的文字。
另一种为某人解决问题的方法是使用两个 OPTIONAL
模式,例如 :
optional {
?country rdfs:label ?label
filter langMatches(lang(?label), "en")
}
optional {
?country rdfs:label ?label
}
但我的模板中有 ?s ?p ?o
模式,它已经 return 包含与特定主题关联的所有三元组,因此可选模式在这里似乎没用。
我读过其他类似的问题,但似乎没有一个适合我的查询模板,所以如果有人能帮助我理解这一点,我将不胜感激。
如果我对你的问题的解释是正确的,那么使用一个 FILTER
和几个按偏好方式排序的析取是可行的,例如喜欢:
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
select * where {
bind(skos:member as ?s)
?s ?p ?o .
filter (
!isLiteral(?o) ||
langmatches(lang(?o), "en")
|| (langmatches(lang(?o), "") && not exists {
?s ?p ?other.
filter(isLiteral(?other) && langmatches(lang(?other), "en"))
}))
}
- 它将通过任何 non-literal 价值赏金或
?o
- 然后对于语言标签匹配
@en
的文字
- 最后,没有语言标签的文字,没有相同主语和谓语的语句,有一个带有
@en
标签的文字
HTH
在上面的查询中使用 skos:member
只是为了将某些东西绑定到 ?s
并且它是任意的...
有点晚了,但我刚刚找到的解决方案是
SELECT distinct ?s ?p ?o WHERE {
?this :is :something. // this pattern is passed as argument
// to the js func that manage the
// query
{
bind(?this as ?s)
?s ?p ?o.
FILTER(IF(NOT EXISTS {SELECT ?r WHERE {?s ?p ?r FILTER(lang(?r) = 'en')}}, lang(?o) = '', lang(?o) = 'en'))
}
}
过滤器 FILTER(IF(NOT EXISTS {SELECT ?r WHERE {?s ?p ?r FILTER(lang(?r) = 'en')}}, lang(?o) = '', lang(?o) = 'en'))
将给出带有 'en' 标记的结果,否则,它将给出没有语言标记的结果。
我是 SPARQL 的新手,我正在尝试为由我的查询模板 return 编辑的文字插入某种语言过滤器。 问题是数据集没有提供结构良好的标记系统,所以我必须以某种条件方式限制结果,并使这些条件适用于以下模板:
SELECT distinct ?s ?p ?o WHERE {
?this :is :something. // this pattern is passed as argument
// to the js func that manage the
// query
{
bind(?this as ?s)
?s ?p ?o.
// here i putted my filters
}
}
我想添加的过滤器应该提供一种方法 return 只有 "english version" 用于带有文字的模式。如果未提供英文版本,则 return 未标记的版本 - 始终存在未标记的版本。
根据类似问题的解决方案,我尝试了这个:
filter(!isLiteral(?o) || (langMatches(lang(?o), 'en')) || lang(?o)='')
但是 - 当然 - 最终 return 两者兼而有之:英语和未标记的文字。
另一种为某人解决问题的方法是使用两个 OPTIONAL
模式,例如
optional {
?country rdfs:label ?label
filter langMatches(lang(?label), "en")
}
optional {
?country rdfs:label ?label
}
但我的模板中有 ?s ?p ?o
模式,它已经 return 包含与特定主题关联的所有三元组,因此可选模式在这里似乎没用。
我读过其他类似的问题,但似乎没有一个适合我的查询模板,所以如果有人能帮助我理解这一点,我将不胜感激。
如果我对你的问题的解释是正确的,那么使用一个 FILTER
和几个按偏好方式排序的析取是可行的,例如喜欢:
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
select * where {
bind(skos:member as ?s)
?s ?p ?o .
filter (
!isLiteral(?o) ||
langmatches(lang(?o), "en")
|| (langmatches(lang(?o), "") && not exists {
?s ?p ?other.
filter(isLiteral(?other) && langmatches(lang(?other), "en"))
}))
}
- 它将通过任何 non-literal 价值赏金或
?o
- 然后对于语言标签匹配
@en
的文字
- 最后,没有语言标签的文字,没有相同主语和谓语的语句,有一个带有
@en
标签的文字
HTH
在上面的查询中使用 skos:member
只是为了将某些东西绑定到 ?s
并且它是任意的...
有点晚了,但我刚刚找到的解决方案是
SELECT distinct ?s ?p ?o WHERE {
?this :is :something. // this pattern is passed as argument
// to the js func that manage the
// query
{
bind(?this as ?s)
?s ?p ?o.
FILTER(IF(NOT EXISTS {SELECT ?r WHERE {?s ?p ?r FILTER(lang(?r) = 'en')}}, lang(?o) = '', lang(?o) = 'en'))
}
}
过滤器 FILTER(IF(NOT EXISTS {SELECT ?r WHERE {?s ?p ?r FILTER(lang(?r) = 'en')}}, lang(?o) = '', lang(?o) = 'en'))
将给出带有 'en' 标记的结果,否则,它将给出没有语言标记的结果。