私が理解しているように、1 つの例外を除いて、名前を辞書順に並べ替えます (名、ミドル ネーム、姓の順):先頭に名のないエントリを配置する代わりに、それらを最後に。これが正しければ、次のような順序付け条件が必要です。
ORDER BY DESC( bound( ?firstName )) ?firstName ?middleName ?lastName
これは、 、 、および がそれぞれファースト ネーム、ミドル ネーム、およびラスト ネームを表す、使用する:fn
RDF: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".
?firstName
オプションでバインドするデータ用のこの SPARQL と、上で説明した順序:
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
names.n3
dataと 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" |
---------