我是SPARQL 1.1的初学者.我有一个N-Triples文件,如下所示.我想找到Work_RVU(最后一个属性)和相关代码(第四个属性)的最大值.
<file://PPRVU12.xlsx/69540> <http://www.w3.org/1999/02/22-rdf-syntax-ns?#type> <http://cms.gov/HCPCS> .
<file://PPRVU12.xlsx/69540> <http://www.w3.org/2000/01/rdf-schema#label> "Remove ear lesion" .
<file://PPRVU12.xlsx/69540> <file://PPRVU12.xlsx#Status_Code> "A" .
<file://PPRVU12.xlsx/69540> <file://PPRVU12.xlsx#Code> "69540" .
<file://PPRVU12.xlsx/69540> <file://PPRVU12.xlsx#Work_RVU> "1.25" .
<file://PPRVU12.xlsx/69550> <http://www.w3.org/1999/02/22-rdf-syntax-ns?#type> <http://cms.gov/HCPCS> .
<file://PPRVU12.xlsx/69550> <http://www.w3.org/2000/01/rdf-schema#label> "Remove ear lesion" .
<file://PPRVU12.xlsx/69550> <file://PPRVU12.xlsx#Status_Code> "A" .
<file://PPRVU12.xlsx/69550> <file://PPRVU12.xlsx#Code> "69550" .
<file://PPRVU12.xlsx/69550> <file://PPRVU12.xlsx#Work_RVU> "11.15" .
<file://PPRVU12.xlsx/69552> <http://www.w3.org/1999/02/22-rdf-syntax-ns?#type> <http://cms.gov/HCPCS> .
<file://PPRVU12.xlsx/69552> <http://www.w3.org/2000/01/rdf-schema#label> "Remove ear lesion" .
<file://PPRVU12.xlsx/69552> <file://PPRVU12.xlsx#Status_Code> "A" .
<file://PPRVU12.xlsx/69552> <file://PPRVU12.xlsx#Code> "69552" .
<file://PPRVU12.xlsx/69552> <file://PPRVU12.xlsx#Work_RVU> "19.81" .
Run Code Online (Sandbox Code Playgroud)
最大RVU应为19.81,代码应为"69552".我可以打印19.81但总是打印"69540",这意味着它总是选择它每次遇到的第一个代码.
我的SPARQL代码如下:
PREFIX pre: <file://PPRVU12.xlsx#>
SELECT ?code (MAX (?val) AS ?Max_RVU)
WHERE{
?code pre:Work_RVU ?val .
}
Run Code Online (Sandbox Code Playgroud)
这个查询中有错误吗?我还尝试了另一个查询,
PREFIX pre: <file://PPRVU12.xlsx#>
PREFIX head: <http://www.w3.org/1999/02/22-rdf-syntax-ns?#>
SELECT ?code (MAX (?val) AS ?Max_RVU)
WHERE{
?d head:type <http://cms.gov/HCPCS> .
?d pre:Code ?code .
?d pre:Work_RVU ?val .
}
Run Code Online (Sandbox Code Playgroud)
但结果是一样的.
我无法重现您描述的行为.当我尝试使用Jena的ARQ对您的数据运行任一查询时,我收到一个错误:
$ arq --query query.sparql --data data.nt
Non-group key variable in SELECT: ?code
Run Code Online (Sandbox Code Playgroud)
但是,这很容易解决.GROUP BY ?code我认为,添加到您的第一个查询会使输出更接近您想要的输出.
PREFIX pre: <file://PPRVU12.xlsx#>
SELECT ?code (MAX (?val) AS ?Max_RVU)
WHERE {
?code pre:Work_RVU ?val .
}
GROUP BY ?code
Run Code Online (Sandbox Code Playgroud)
这意味着匹配事物的结果按其组划分,然后在pre:Work_RVU与a关联的所有值中划分?code,在代码的输出中选择最大值.输出如下所示:
$ arq --query query.sparql --data data.nt
-----------------------------------------
| code | Max_RVU |
=========================================
| <file://PPRVU12.xlsx/69540> | "1.25" |
| <file://PPRVU12.xlsx/69550> | "11.15" |
| <file://PPRVU12.xlsx/69552> | "19.81" |
-----------------------------------------
Run Code Online (Sandbox Code Playgroud)
实际上,这确实显示了与每个代码相关的最大值.但是,由于数据中的每个代码只有一个RVU值,我想知道您所寻找的实际上并不是所有代码中具有最大RVU值的代码.如果是这种情况,您可以通过选择代码及其RVU,按RVU 排序,并仅选择第一个结果来实现.例如,我们可以?val使用此查询按降序排序:
PREFIX pre: <file://PPRVU12.xlsx#>
SELECT ?code ?val
WHERE {
?code pre:Work_RVU ?val .
}
ORDER BY DESC(?val)
Run Code Online (Sandbox Code Playgroud)
哪个产生
$ arq --query query.sparql --data data.nt
-----------------------------------------
| code | val |
=========================================
| <file://PPRVU12.xlsx/69552> | "19.81" |
| <file://PPRVU12.xlsx/69550> | "11.15" |
| <file://PPRVU12.xlsx/69540> | "1.25" |
-----------------------------------------
Run Code Online (Sandbox Code Playgroud)
您可能只想要第一行,所以我们添加LIMIT 1:
PREFIX pre: <file://PPRVU12.xlsx#>
SELECT ?code ?val
WHERE {
?code pre:Work_RVU ?val .
}
ORDER BY DESC(?val)
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
哪个产生
$ arq --query query.sparql --data data.nt
-----------------------------------------
| code | val |
=========================================
| <file://PPRVU12.xlsx/69552> | "19.81" |
-----------------------------------------
Run Code Online (Sandbox Code Playgroud)
您可能会遇到RVU值存储为字符串的问题,这意味着您从SPARQL查询获得的顺序不是数字排序,而是词法排序.最好的解决方案是清理数据,使其实际包含数字.但是,只要您只是尝试获取最大值,并且字符串都具有相同的格式,您仍将获得所需的结果,因为更高的值将需要更长的字符串,以及数字的词法顺序字符与数字的数字顺序一致.
| 归档时间: |
|
| 查看次数: |
413 次 |
| 最近记录: |