簡體   English   中英

SPARQL按字面數字部分排序

[英]SPARQL order by digit part of literal

如何僅使用字面值中的數字來訂購SPARQL查詢的結果?

我有一個查詢返回一個變量?loc​​usFrom,它可以包含文字值,如

  • 1
  • 21R
  • 33V
  • 45ra
  • 156vb

我想使用ORDER BY並僅使用數字部分並忽略字母對結果進行排序。

我努力了

SELECT ?locusFrom ?locusTo ?locusTarget ?uniCont1
WHERE {
bm:BNFet45 dcterms:hasPart ?uniProd .
?uniProd a SdC:UniProd .
?uniProd dcterms:hasPart ?uniCont .
?uniCont a SdC:UniCont .
?uniCont dcterms:hasPart ?uniCont1 .
?uniCont1 a SdC:UniCont ;
            bm:hasLocus ?locus .
            OPTIONAL{?locus bm:locusTarget ?locusTarget}
            OPTIONAL{?locus bm:locusFrom ?locusFrom}
            OPTIONAL{?locus bm:locusTo ?locusTo}
BIND( (STRBEFORE(?locusFrom,"r") || STRBEFORE(?locusFrom,"v") ) as ?substring )
}
ORDER BY ?substring

並返回此結果(縮短)

<sr:sparql xmlns:sr="http://www.w3.org/2005/sparql-results#">
<sr:head>
<sr:variable name="locusFrom"/>
<sr:variable name="locusTo"/>
<sr:variable name="locusTarget"/>
<sr:variable name="uniCont1"/>
</sr:head>
<sr:results>
<sr:result>
<sr:binding name="locusTarget">
<sr:literal>12</sr:literal>
</sr:binding>
<sr:binding name="uniCont1">
<sr:uri>http://betamasaheft.eu/BNFet45/msitem/f2_i1.1</sr:uri>
</sr:binding>
</sr:result>
<sr:result>
<sr:binding name="locusFrom">
<sr:literal>1r</sr:literal>
</sr:binding>
<sr:binding name="uniCont1">
<sr:uri>http://betamasaheft.eu/BNFet45/msitem/p1_i1.1</sr:uri>
</sr:binding>
</sr:result>
<sr:result>
<sr:binding name="locusFrom">
<sr:literal>18v</sr:literal>
</sr:binding>
<sr:binding name="uniCont1">
<sr:uri>http://betamasaheft.eu/BNFet45/msitem/p1_i1.2</sr:uri>
</sr:binding>
</sr:result>
<sr:result>
<sr:binding name="locusFrom">
<sr:literal>53r</sr:literal>
</sr:binding>
<sr:binding name="uniCont1">
<sr:uri>http://betamasaheft.eu/BNFet45/msitem/p1_i1.3</sr:uri>
</sr:binding>
</sr:result>
<sr:result>
<sr:binding name="locusFrom">
<sr:literal>17r</sr:literal>
</sr:binding>
<sr:binding name="locusTo">
<sr:literal>17v</sr:literal>
</sr:binding>
<sr:binding name="uniCont1">
<sr:uri>http://betamasaheft.eu/BNFet45/msitem/f2_i1.4</sr:uri>
</sr:binding>
</sr:result>
<sr:result>
<sr:binding name="locusFrom">
<sr:literal>18r</sr:literal>
</sr:binding>
<sr:binding name="locusTo">
<sr:literal>23r</sr:literal>
</sr:binding>
<sr:binding name="uniCont1">
<sr:uri>http://betamasaheft.eu/BNFet45/msitem/f2_i1.5</sr:uri>
</sr:binding>
</sr:result>
</sr:results>
</sr:sparql>

它接觸到我,它開始再次計數在第一組之后。 我怎樣才能讓它一起排序? 非常感謝你!

基本上, REPLACE接受XPath樣式的正則表達式作為其第二個參數。 但是,由於?locusFrom綁定在OPTIONAL ,您可能還需要COALESCE

SELECT * {
   VALUES (?locusFrom) {
       (UNDEF)
       ("")
       ("1")
       ("156vb")
       ("21r")
       ("33vu")
       ("45ra")
       ("ab")
   }
   BIND (xsd:integer(REPLACE(?locusFrom, "\\D+", "")) AS ?number1)
   BIND (COALESCE(?number1, 0) AS ?number2)
} ORDER BY ?number2

暫無
暫無

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

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