SPARQL 按文字的数字部分排序
SPARQL order by digit part of literal
如何仅使用文字值中的数字对 SPARQL 查询的结果进行排序?
我有一个查询,其中 returns 一个变量 ?locusFrom 可以包含像
这样的文字值
- 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
它 returns 这个结果(缩短)
<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-style 正则表达式作为它的第二个参数。但是,由于 ?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
如何仅使用文字值中的数字对 SPARQL 查询的结果进行排序?
我有一个查询,其中 returns 一个变量 ?locusFrom 可以包含像
这样的文字值- 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
它 returns 这个结果(缩短)
<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-style 正则表达式作为它的第二个参数。但是,由于 ?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