我跟进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
如何相互作用。
需要额外的
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
未指定字符串的顺序。
从马口中:
2011年4月22日 19:01,史蒂夫·哈里斯 (Steve Harris) 写道:
2011-04-22 06:18,Jeen Broekstra 写道:
但是,查看 SPARQL 1.1 查询规范,我认为这不是一个有保证的结果:据我所知,解决方案修饰符
应该应用于解决方案序列 after 分组和聚合,因此它不能影响ORDER BY
的输入顺序。GROUP_CONCAT
没错。
提问者似乎使用的是 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