0

我使用以下命令从命令行使用jqJSON 解析器从 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是 Wikidata 条目$PID的 ID,以及我们要打印的属性的 ID(在本例中为软件版本"P348")。

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

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

4

1 回答 1

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 ...

于 2016-06-18T19:00:42.113 回答