i使用以下命令从命令行中获取(最新)从命令行中获取某些软件的(最新)版本,使用jq
作为JSON PARSER。
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条目的ID,而$PID
我们要打印的属性的ID(在这种情况下为软件版本" P348")。
通常可以正常工作,因为P348
的第一个索赔([0]
)是最新版本,但是例如" Q13166"(WordPress),我们对软件版本有几个主张。如何获得最新的稳定而不是第一个主张?
我可能应该(在我们有多个主张的情况下),找到ITH主张,其中版本类型" P548"等于稳定版本" Q12355314"。或找出更喜欢排名的蛤。如何使用JQ做到这一点?是否有更简单的方法,例如,将SPARQL查询发送到查询.wikidata.org?
以下收集所有相关版本号,并使用此处定义为" 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 ...