sparql 选择 wikidata group_by 和 concat

Posted

技术标签:

【中文标题】sparql 选择 wikidata group_by 和 concat【英文标题】:sparql select wikidata group_by and concat 【发布时间】:2022-01-14 05:40:23 【问题描述】:

我想提取一个球员列表和一个它参加过的俱乐部的列表,用逗号分隔。

SELECT DISTINCT ?playerLabel
(GROUP_CONCAT(?teamLabel  ; separator=',') as ?teams)
WHERE 
  ?player wdt:P106 wd:Q937857 .
  
  ?player wdt:P2574 ?team 
  
  SERVICE wikibase:label  bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". 

GROUP BY ?playerLabel

我有两个问题:

    我没有得到每个球员的球队列表,只有名字和变量 ?teams 为空。 如果我不使用 GROUP CONCAT 和 GROUP BY,我会获取团队 ID,但我更喜欢团队标签。

例如 2 个玩家...:

playerLabel       teams

Cristiano Ronaldo Sporting Portugal, Manchester U, Real Madrid, Juventus, Manchester U
Leo Messi         Barcelona, PSG

至少我需要 Concat 和 group by,即使有代码...... 谢谢

【问题讨论】:

【参考方案1】:

您使用P2574,即“National-Football-Teams.com 球员 ID”。虽然 National-Football-Teams.com 列出了一名球员效力的所有球队,但无法通过 Wikidata 查询服务访问此数据。但是 Wikidata 本身为运动队成员提供了一个专用属性:P54。 所以写?player wdt:P54 ?team而不是?player wdt:P2574 ?team

另外,您需要添加?team rdfs:label ?teamLabel . filter (lang(?teamLabel)='en') 才能在GROUP_CONCAT() 中使用?teamLabel

因此,完整的工作查询如下所示(仅限美国玩家以避免查询超时):

SELECT DISTINCT ?playerLabel (GROUP_CONCAT(?teamLabel  ; separator=',') as ?teams)
WHERE 
  ?player wdt:P106 wd:Q937857 .
  ?player wdt:P27 wd:Q30 . 
  ?player wdt:P54 ?team .
  ?team rdfs:label ?teamLabel . filter (lang(?teamLabel)='en')
  SERVICE wikibase:label  bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". 

GROUP BY ?playerLabel

【讨论】:

以上是关于sparql 选择 wikidata group_by 和 concat的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Wikidata 上创建一个 SPARQL 查询,以获取所有具有 Project Gutenberg 电子书 ID 的书籍?

使用 WikiData Sparql 高效查询抽象元素

SPARQL UNION不产生第二个查询的结果。

如何优化我的递归 SPARQL 查询?

为啥这个 SPARQL 查询超时以及如何优化这个查询?

sparql_01_简介