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