簡體   English   中英

Sparql:如果名字為空,則在排序列表的最后顯示名稱

[英]Sparql : To display the name in the last of the sorted list if its firstname is empty

在我的代碼中,我將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))

在輸出中,雖然第一個名稱為空的名稱會出現在末尾,但其余名稱未按升序排序。

據我了解,您希望按照字典順序對名稱進行排序(按名字,中間名,然后按姓氏排序),但有一個例外:您想將開頭沒有名字的條目放在開頭,而不是他們在最后。 如果正確,那么您需要訂購條件,例如:

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

調用數據names.n3和查詢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" |
---------

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM