1

在我的代码中,我将 first、middle 和 lastname 绑定为一个名称,并使用 name 对其进行排序。

我想按升序对绑定的名称进行排序,并且没有第一个名称的名称应显示在排序列表的末尾。

请分享您解决此问题的想法。

我的代码:

bind ( COALESCE(?firstName, "") As ?firstName1).

bind ( COALESCE(?middleName, "") As ?middleName1).

bind ( COALESCE(?lastName, "") As ?lastName1).

bind (concat(str(?firstName1),str(?middleName1),str(?lastName1)) as ?name).

}

order by (regex(" " ,?firstName1) && bound (?name))

在输出中,虽然第一个名称为空的名称出现在最后,但其余名称未按 asc 顺序排序。

4

1 回答 1

0

据我了解,您希望按字典顺序对名称进行排序(按名字排序,然后按中间名,然后按姓氏),但有一个例外:不是在开头放置没有名字的条目,而是要放置他们在最后。如果这是正确的,您需要一个订购条件,例如:

ORDER BY DESC( bound( ?firstName )) ?firstName ?middleName ?lastName

这是一些可以使用的 RDF,其中:fn:mn:ln分别代表名字、中间名和姓氏:

@prefix : <http://www.example.org/>.

:aaa :fn "A"; :mn "A"; :ln "A".
:aab :fn "A"; :mn "A"; :ln "B".
:aba :fn "A"; :mn "B"; :ln "A".

:_aa          :mn "A"; :ln "A".
:_ab          :mn "A"; :ln "B".
:_ba          :mn "B"; :ln "A".

这个 SPARQL 用于?firstName可选绑定的数据,以及我上面描述的顺序:

PREFIX : <http://www.example.org/>

SELECT ?firstName ?middleName ?lastName
WHERE {
             ?x :mn ?middleName .
             ?x :ln ?lastName .
  OPTIONAL { ?x :fn ?firstName . }
}
ORDER BY DESC( bound( ?firstName )) ?firstName ?middleName ?lastName

调用 datanames.n3和 query names.sparql,这是我使用 Jena 的 ARQ 对数据运行查询时得到的结果:

$ /usr/local/lib/apache-jena-2.10.0/bin/arq --data names.n3 --query names.sparql
-------------------------------------
| firstName | middleName | lastName |
=====================================
| "A"       | "A"        | "A"      |
| "A"       | "A"        | "B"      |
| "A"       | "B"        | "A"      |
|           | "A"        | "A"      |
|           | "A"        | "B"      |
|           | "B"        | "A"      |
-------------------------------------

即使您正在投影?name而不是 , 或 中的任何一个?firstName?middleName您仍然可以通过这种方式进行排序?lastName。例如,查询

PREFIX : <http://www.example.org/>

SELECT ?name
WHERE {
             ?x :mn ?middleName .
             ?x :ln ?lastName .
  OPTIONAL { ?x :fn ?firstName . }

  bind ( concat( str(coalesce(?firstName, "_")), str(?middleName), str(?lastName) ) as ?name).
}
ORDER BY DESC( bound( ?firstName )) ?firstName ?middleName ?lastName

生产

---------
| name  |
=========
| "AAA" |
| "AAB" |
| "ABA" |
| "_AA" |
| "_AB" |
| "_BA" |
---------
于 2013-04-30T12:32:32.667 回答