SPARQL 1.1中的MAX?

时间:2013-06-09 23:50:42

标签: rdf sparql

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

但结果是一样的。

1 个答案:

答案 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查询获得的顺序不是数字排序,而是词法排序。最好的解决方案是清理数据,使其实际包含数字。但是,只要您只是尝试获取最大值,并且字符串都具有相同的格式,您仍将获得所需的结果,因为较高的值将需要更长的字符串,以及数字的词法顺序字符与数字的数字顺序一致。