我是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" .
最大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 .
}
此查询中是否有错误?我还尝试了另一个查询,
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 .
}
但结果是一样的。
答案 0 :(得分:6)
我无法重现您描述的行为。当我尝试使用Jena的ARQ对您的数据运行任一查询时,我收到错误:
$ arq --query query.sparql --data data.nt
Non-group key variable in SELECT: ?code
然而,这很容易解决。在我的第一个查询中添加GROUP BY ?code
可以使输出更接近您想要的内容。
PREFIX pre: <file://PPRVU12.xlsx#>
SELECT ?code (MAX (?val) AS ?Max_RVU)
WHERE {
?code pre:Work_RVU ?val .
}
GROUP BY ?code
这意味着匹配问题的结果按其组进行分区,然后对与pre:Work_RVU
关联的所有?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" |
-----------------------------------------
实际上,这确实显示了与每个代码相关的最大值。但是,由于数据中的每个代码只有一个RVU值,我想知道您要查找的内容实际上不是所有代码中具有最大RVU值的代码。如果是这种情况,您可以通过选择RVU的代码及其RVU,排序,并仅选择第一个结果来实现。例如,我们可以使用此查询按降序排序?val
:
PREFIX pre: <file://PPRVU12.xlsx#>
SELECT ?code ?val
WHERE {
?code pre:Work_RVU ?val .
}
ORDER BY DESC(?val)
产生
$ 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" |
-----------------------------------------
您可能只想要第一行,因此我们添加LIMIT 1
:
PREFIX pre: <file://PPRVU12.xlsx#>
SELECT ?code ?val
WHERE {
?code pre:Work_RVU ?val .
}
ORDER BY DESC(?val)
LIMIT 1
产生
$ arq --query query.sparql --data data.nt
-----------------------------------------
| code | val |
=========================================
| <file://PPRVU12.xlsx/69552> | "19.81" |
-----------------------------------------
您可能遇到将RVU值存储为字符串的问题,这意味着您从SPARQL查询获得的顺序不是数字排序,而是词法排序。最好的解决方案是清理数据,使其实际包含数字。但是,只要您只是尝试获取最大值,并且字符串都具有相同的格式,您仍将获得所需的结果,因为较高的值将需要更长的字符串,以及数字的词法顺序字符与数字的数字顺序一致。