我正在尝试获取所有拥有超过 3 篇作品的作者的列表 - DBpedia Sparql
Posted
技术标签:
【中文标题】我正在尝试获取所有拥有超过 3 篇作品的作者的列表 - DBpedia Sparql【英文标题】:I am trying to get list of all the authors who have had more than 3 piece of work - DBpedia Sparql 【发布时间】:2017-04-25 17:33:15 【问题描述】:我正在尝试获取已完成 3 项或更多工作的所有作者的列表(在 DBpedia 中)。
我的例子可以运行在:http://dbpedia.org/sparql
基本代码
select (count(?work) as ?totalWork), ?author
Where
?work dbo:author ?author.
GROUP BY ?author
我让每个作者完成的工作总量。但是当我尝试过滤以仅显示拥有超过 3 篇作品的作者列表时。我得到错误:
我尝试了 HAVING 关键字或使用 FILTER 关键字。
使用过滤器
select (count(?work) as ?tw), ?author
Where
?work dbo:author ?author.
FILTER (?work > 3).
GROUP BY ?author
error: Virtuoso 22023 Error VECDT: SR066: Unsupported case in CONVERT (INTEGER -> IRI_ID)
使用 HAVING 关键字
select (count(?work) as ?tw), ?author
Where
?work dbo:author ?author.
GROUP BY ?author
HAVING (?tw > 3)
Virtuoso 37000 Error SP031: SPARQL compiler: Variable ?tw is used in the result set outside aggregate and not mentioned in GROUP BY clause
【问题讨论】:
【参考方案1】:使用HAVING
是正确的,但是有一个limitation in SPARQL with indirectly referring to aggregates。
这个有效:
SELECT (count(?work) as ?tw) ?author
WHERE
?work dbo:author ?author.
GROUP BY ?author
HAVING (count(?work) > 3)
【讨论】:
@TallTed 感谢您的参考,我不知道这个。不幸的是,它不会在 sparql.org/query-validator.html 上引发错误。我会和那里的维护人员谈谈。【参考方案2】:HAVING (?tw > 3)
是正确的 SPARQL。由于SELECT
,HAVING
在分配之后过滤,因此?tw
在投影之前可见。
(prefix ((dbo: <http://purl.org/dc/elements/1.1/>))
(project (?tw ?author)
(filter (> ?tw 3)
(extend ((?tw ?.0))
(group (?author) ((?.0 (count ?work)))
(bgp (triple ?work dbo:author ?author)))))))
其中?.0
是count
的赋值。
【讨论】:
我试图运行它,但它给出了一个错误,我想看看结果并理解代码。有人可以解决这个问题:Virtuoso 37000 Error SP030: SPARQL compiler, line 0: Only '(' and DISTINCT are allowed after SPARQL expression at '?' 您在这里所说的似乎与规范直接相关——"Note that, due to the logic position in which the HAVING clause is evaluated, expressions projected by the SELECT clause are not visible to the HAVING clause."以上是关于我正在尝试获取所有拥有超过 3 篇作品的作者的列表 - DBpedia Sparql的主要内容,如果未能解决你的问题,请参考以下文章