如何使用维基数据获取某些软件的最新版本?
How to get latest version of certain software using 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") .
这通常工作正常,因为通常 P348
的第一个声明 ([0]
) 是最新版本,但是例如对于“Q13166” (WordPress),我们有关于软件版本的几个声明。如何获得最新的稳定版本而不是第一个声明?
我可能应该(在我们有多个声明的情况下)找到第 i 个声明,其中版本类型为“P548" equals to stable version "Q12355314". Or find out the clam that has preferred rank. How to do that with jq? Is there an easier way, such as for example sending an SPARQL query to query.wikidata.org?
以下收集所有相关版本号,并使用此处定义的过滤器确定 "maximum" 值 "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 ...
我使用以下命令从命令行使用 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") .
这通常工作正常,因为通常 P348
的第一个声明 ([0]
) 是最新版本,但是例如对于“Q13166” (WordPress),我们有关于软件版本的几个声明。如何获得最新的稳定版本而不是第一个声明?
我可能应该(在我们有多个声明的情况下)找到第 i 个声明,其中版本类型为“P548" equals to stable version "Q12355314". Or find out the clam that has preferred rank. How to do that with jq? Is there an easier way, such as for example sending an SPARQL query to query.wikidata.org?
以下收集所有相关版本号,并使用此处定义的过滤器确定 "maximum" 值 "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 ...