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

问题描述 投票:0回答:3

我跟进query,其中 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 

给予

schema:PublicationEvent   "OnDemandEvent BroadcastEvent"
schema:UserInteraction    "UserPageVisits UserComments UserPlays UserBlocks UserDownloads UserPlusOnes UserLikes UserCheckins UserTweets"

这不是按字母顺序排列的。如果我将排序顺序替换为

desc
,结果是完全相同的。我似乎不明白
group by
order by
以及可能的
bind
如何相互作用。

sparql jena fuseki
3个回答
4
投票

需要额外的

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 

2
投票

18.5.1.7 GroupConcat

未指定字符串的顺序。


从马口中

2011年4月22日 19:01,史蒂夫·哈里斯 (Steve Harris) 写道:

2011-04-22 06:18,Jeen Broekstra 写道:

但是,查看 SPARQL 1.1 查询规范,我认为这不是一个有保证的结果:据我所知,解决方案修饰符

ORDER BY
应该应用于解决方案序列 after 分组和聚合,因此它不能影响
GROUP_CONCAT
的输入顺序。

没错。


0
投票

提问者似乎使用的是 Jena 或 Fuseki。可能有些用户也对 Wikidata 的 SPARQL 端点、使用 Blazegraph 的 Wikidata 查询服务感兴趣。

对于我尝试使用维基数据查询服务的几个例子,我发现子查询中的

ORDER BY
- 就像 @user855443 所建议的那样 - “似乎”可以解决问题。我不熟悉 Blazegraph 的内部结构,无法判断这是否会保持一致。

这是一个类似 Scholia 查询的示例 (https://scholia.toolforge.org/work/Q57267388):https://w.wiki/AFFx

PREFIX target: <http://www.wikidata.org/entity/Q57267388>

SELECT
  (GROUP_CONCAT(?author; separator=", ") AS ?authors)

WITH {

SELECT
  ?order ?author
WHERE {
  {
    target: p:P50 ?author_statement .
    ?author_statement ps:P50 ?author_ .
    ?author_ rdfs:label ?author .
    FILTER (LANG(?author) = 'en')
    OPTIONAL {
       ?author_statement pq:P1545 ?order_ .
       BIND(xsd:integer(?order_) AS ?order)
     }
   }
   UNION
   {
     target: p:P2093 ?authorstring_statement .
     ?authorstring_statement ps:P2093 ?author
     OPTIONAL {
       ?authorstring_statement pq:P1545 ?order_ .
       BIND(xsd:integer(?order_) AS ?order)
     }
   } 
} ORDER BY DESC(?order)
} AS %authors

WHERE {
  INCLUDE %authors
}
GROUP BY ?dummary
© www.soinside.com 2019 - 2024. All rights reserved.