1

我是 SPARQL 1.1 的初学者。我有一个如下所示的 N-Triples 文件。Work_RVU我想找到(最后一个属性)和相关代码(第 4 个属性)的最大值。

<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 .
}

但结果是一样的。

4

1 回答 1

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与 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" |
-----------------------------------------

这确实显示了与每个代码相关的最大值。但是,由于数据中的每个代码只有一个 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 查询中获得的排序不是数字排序,而是词法排序。最好的解决方案是清理您的数据,使其实际包含数字。但是,只要您只是想获得最大值,并且字符串都具有相同的格式,您仍然会得到您想要的结果,因为更高的值将需要更长的字符串,以及数字的词法排序字符与数字的数字顺序一致。

于 2013-06-10T13:46:38.680 回答