如何使用Wikidata获取某些软件的最新版本?

时间:2016-06-18 13:24:47

标签: json bash sparql jq wikidata

我使用以下命令从命令行使用jq作为JSON解析器从Wikidata获取某些软件的(最新)版本。

curl -sL "http://www.wikidata.org/w/api.php?action=wbgetentities&ids=$QID&languages=en&format=json" |
jq ".entities.$QID.claims.$PID""[0].mainsnak.datavalue.value" 

其中$QID是维基数据条目的ID,$PID是我们要打印的属性的ID(在本例中为软件版本"P348")。

这通常可行,因为[0]的第一个声明(P348)通常是最新版本,但例如对于" Q13166" (WordPress),我们有几个关于软件版本的说法。如何获得最新的稳定而不是第一个索赔?

我可能应该(在我们有多个声明的情况下),找到第i个声明,版本类型" P548"等于稳定版本" Q12355314"。或者找出喜欢等级的蛤蜊。如何用jq做到这一点?有没有更简单的方法,例如将SPARQL查询发送到query.wikidata.org

1 个答案:

答案 0 :(得分:1)

以下内容收集所有相关的版本号,并确定"最大值"值使用此处定义的过滤器" lexmax":

jq --arg QID "$QID" --arg PID "$PID" '
  def lexmax:
    map( split(".")
         | map(if test("^[0-9]*$") then tonumber else . end) )
  | max | map(tostring) | join(".");

  .entities | .[$QID] | .claims | .[$PID]
  | map(.mainsnak.datavalue.value)
  | lexmax'

QID = Q13166 PID = P348的结果是

"4.5.2"

如果您想使用.rank == "preferred"作为选择标准,可以使用以下内容:

def lexmax:
  map( split(".")
       | map(if test("^[0-9]*$") then tonumber else . end) )
  | max | map(tostring) | join(".");

def when(condition; action):
  if condition? // null then action else . end;

.entities | .[$QID] | .claims | .[ $PID ]
| map( select(when(has("rank"); .rank == "preferred"))
       | .mainsnak.datavalue.value)
| lexmax

或者你可能不需要使用lexmax ...