1

私のコードでは、姓、名、ミドルネームを 1 つの名前にバインドし、名前を使用して並べ替えています。

バインドされた名前を昇順に並べ替えたいのですが、最初の名前を持たない名前は、並べ替えられたリストの最後に表示する必要があります。

この問題を解決するためのアイデアを共有してください。

私のコード:

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))

出力では、最初の名前が空の名前が最後に表示されますが、残りの名前は昇順でソートされていません。

4

1 に答える 1

0

私が理解しているように、1 つの例外を除いて、名前を辞書順に並べ替えます (名、ミドル ネーム、姓の順):先頭に名のないエントリを配置する代わりに、それらを最後に。これが正しければ、次のような順序付け条件が必要です。

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

これは、 、 、および がそれぞれファースト ネーム、ミドル ネーム、およびラスト ネームを表す、使用する:fnRDF: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.n3dataと query を呼び出して、names.sparqlJena の 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 に答える