SPARQL分组依据和排序依据:未排序

SPARQL分组依据和排序依据:未排序,sparql,jena,fuseki,Sparql,Jena,Fuseki,接下来,我将使用schema.org数据库查找一个类的子类数量,这是一个比我的应用程序更简单的数据库。我想把孩子们的名字按字母顺序连在一起。查询: prefix schema: <http://schema.org/> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> select ?child (group_concat (?string) as ?strings) where { ?chi

接下来,我将使用schema.org数据库查找一个类的子类数量,这是一个比我的应用程序更简单的数据库。我想把孩子们的名字按字母顺序连在一起。查询:

prefix schema:  <http://schema.org/>
prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#>

select    ?child  (group_concat (?string) as ?strings) 
where {
  ?child  rdfs:subClassOf schema:Event .
     ?grandchild rdfs:subClassOf ?child .
  bind (strafter(str(?grandchild), "http://schema.org/") as ?string)
}   group by ?child  order by asc(?string)
limit 20 
它不是按字母顺序排列的。如果将排序顺序替换为
desc
,则结果完全相同。我似乎不明白
分组、
排序以及可能的
绑定
是如何相互作用的

未指定字符串的顺序


:

2011年4月22日19时01分,史蒂夫·哈里斯写道:

2011年4月22日06时18分,Jeen Broekstra写道:

但是,查看SPARQL 1.1查询规范,我认为这不是一个保证的结果:据我所知,解决方案修饰符
ORDER BY
应该在分组和聚合后应用于解决方案序列,因此它不会影响
GROUP\u CONCAT
的输入顺序

没错

:

未指定字符串的顺序


:

2011年4月22日19时01分,史蒂夫·哈里斯写道:

2011年4月22日06时18分,Jeen Broekstra写道:

但是,查看SPARQL 1.1查询规范,我认为这不是一个保证的结果:据我所知,解决方案修饰符
ORDER BY
应该在分组和聚合后应用于解决方案序列,因此它不会影响
GROUP\u CONCAT
的输入顺序

没错


需要额外的
select
子查询才能在组内推送订单:

prefix schema:  <http://schema.org/>
prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#>

select    ?child  (group_concat (?string) as ?strings) 

where {
    select * 
    {
     ?child  rdfs:subClassOf schema:Event .
     ?grandchild rdfs:subClassOf ?child .
     bind (strafter(str(?grandchild), "http://schema.org/") as ?string)
    } order by asc(?string)
}   group by ?child  
limit 20 
前缀模式:
前缀rdfs:
选择子项(组连接(?字符串)作为字符串)
在哪里{
选择*
{
?子rdfs:模式子类:事件。
?孙子rdfs:子类?子类。
绑定(strafter(str(?孙子),”http://schema.org/)作为?字符串)
}按asc排序(?字符串)
}按儿童分组
限制20

需要额外的
选择
子查询才能在组内推送订单:

prefix schema:  <http://schema.org/>
prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#>

select    ?child  (group_concat (?string) as ?strings) 

where {
    select * 
    {
     ?child  rdfs:subClassOf schema:Event .
     ?grandchild rdfs:subClassOf ?child .
     bind (strafter(str(?grandchild), "http://schema.org/") as ?string)
    } order by asc(?string)
}   group by ?child  
limit 20 
前缀模式:
前缀rdfs:
选择子项(组连接(?字符串)作为字符串)
在哪里{
选择*
{
?子rdfs:模式子类:事件。
?孙子rdfs:子类?子类。
绑定(strafter(str(?孙子),”http://schema.org/)作为?字符串)
}按asc排序(?字符串)
}按儿童分组
限制20

未指定
组\u concat
中字符串的顺序,而是取自子句的顺序,因此应由
order by
子句定义。我后来发现,需要一个附加的
select
子查询。@user855443这不是真的。斯坦尼斯拉夫·克拉林是完全正确的。
group\u concat
的输入是一个多集,因此,订单将丢失。根据可能保留的三重存储,但是根据W3C规范,没有任何保证。@StanislavKralin因此,我们似乎必须等到SPARQL 1.2?没有指定
group_concat
中字符串的顺序,而是取自子句的顺序,因此它应该由
order by
子句定义。我后来发现,需要一个附加的
select
子查询。@user855443这不是真的。斯坦尼斯拉夫·克拉林是完全正确的。
group\u concat
的输入是一个多集,因此,订单将丢失。根据triple store的不同,它可能会被保留,但根据W3C规范,它没有任何保证。@StanislavKralin因此,我们似乎必须等到SPARQL 1.2?Stanislav Kralin是正确的。由于
group_concat
在多集上工作,因此无法保证订单会被保留;在您的示例中,当您将
asc
替换为
desc
时,顺序是否不变?为了使其按照询问者的意愿工作,必须翻转选择<代码>分组依据必须是内部依据,然后是排序依据<代码>分组依据忽略以前的顺序Tanislav Kralin是对的。由于
group_concat
在多集上工作,因此无法保证订单会被保留;在您的示例中,当您将
asc
替换为
desc
时,顺序是否不变?为了使其按照询问者的意愿工作,必须翻转选择<代码>分组依据必须是内部依据,然后是排序依据<代码>分组依据忽略以前的顺序