我使用以下命令从命令行使用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?
答案 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 ...