[英]SPARQL CONTRUCT ordered list with ORDER BY and GROUP BY
親愛的 RDF/SPARQL 社區,
我的目標是通過SPARQL構建一個按產品分組並按時間排序的有序列表,以顯示產品的軌跡。 我正在使用 GraphDB,“scmon”是我的自定義本體。 以下是詳細信息:
我已經存儲了包含產品時間戳 ( scmon:atTime
) 和位置 ( scmon:atLocation
) 的 RDF 數據。 在 Turtle 語法中,它看起來像這樣:
@base <http://example/base/testtracks> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix scmon: <http://www.semanticweb.org/sildop/ontologies/2020/scmon#> .
<tracks5> a scmon:NetPosition;
scmon:atTime "2018-12-10T14:48:59Z"^^xsd:dateTimeStamp;
scmon:atLocation <5>;
scmon:positionOf <product1> .
<tracks6> a scmon:NetPosition;
scmon:atTime "2018-12-12T13:37:19Z"^^xsd:dateTimeStamp;
scmon:atLocation <5002>;
scmon:positionOf <product1> .
<tracks7> a scmon:NetPosition;
scmon:atTime "2018-12-13T19:46:00Z"^^xsd:dateTimeStamp;
scmon:atLocation <2>;
scmon:positionOf <product1> .
<tracks17> a scmon:NetPosition;
scmon:atTime "2018-12-10T14:48:59Z"^^xsd:dateTimeStamp;
scmon:atLocation <4953>;
scmon:positionOf <product2> .
<tracks18> a scmon:NetPosition;
scmon:atTime "2018-12-12T13:37:19Z"^^xsd:dateTimeStamp;
scmon:atLocation <4953004195>;
scmon:positionOf <product2> .
<tracks19> a scmon:NetPosition;
scmon:atTime "2018-12-13T19:46:00Z"^^xsd:dateTimeStamp;
scmon:atLocation <4176>;
scmon:positionOf <product2> .
如您所見,每個track
條目都通過scmon:positionOf
關系分配給一個product
。
我現在的目標是通過 SPARQL 構建一個按產品分組並按時間排序的有序列表,以類似於以下形式顯示產品的軌跡:
<product1> scmon:hasPosSequence <track5>
<track5> scmon:nextPosition <track6>
<track6> scmon:nextPosition <track7>
<track7> scmon:nextPosition NULL
<product2> ...
這種方法的靈感來自 W3C 示例模式 2,用於 n 元關系 ( https://www.w3.org/TR/swbp-n-aryRelations/#pattern2 ),如下所示: https://www.w3。 org/TR/swbp-n-aryRelations/flight_example.jpg
我的前綴scmon
的自定義本體也調整了建議的結構(具有類似的命名類和關系),看起來像這樣https://www.w3.org/TR/swbp-n-aryRelations/flight_classes.jpg
我能夠為<scmon:hasPosSequence>
構建第一個關系/行,它從產品?product
指向由(min(?time))
找到的第一個 position ?netPos
...
PREFIX scmon: <http://www.semanticweb.org/sildop/ontologies/2020/scmon#>
CONSTRUCT {?product scmon:hasPosSequence ?netPos}
where {
{
?product ^scmon:positionOf ?netPos .
?netPos scmon:atTime ?startTime .
}
{
select ?product (min(?time) as ?startTime)
where {
?netPos scmon:positionOf ?product .
?netPos scmon:atTime ?time .
} group by ?product
}
}
...但是我怎么能從那里開始 go 呢? 我已經嘗試了一些 SPARQL SELECT 查詢來測試我是否可以 select 構建scmon:nextPosition
關系所必需的信息,但沒有成功。
是否可以構建這種模式? 還是我必須以某種方式更改我的初始 RDF 數據 model?
提前感謝您的任何提示!
這邊走:
PREFIX scmon: <http://www.semanticweb.org/sildop/ontologies/2020/scmon#>
CONSTRUCT {
?product scmon:hasPosSequence ?track0 .
?track1 scmon:nextPosition ?track3
} WHERE {
?track1 scmon:positionOf ?product ; scmon:atTime ?time1 .
OPTIONAL {
?track2 scmon:positionOf ?product ; scmon:atTime ?time2 .
FILTER (?time2 > ?time1)
FILTER NOT EXISTS {
?track_ scmon:positionOf ?product ; scmon:atTime ?time_
FILTER (?time_ > ?time1 && ?time_ < ?time2)
}
}
BIND (COALESCE(?track2, scmon:NULL, ?track2) AS ?track3)
?track0 scmon:positionOf ?product ; scmon:atTime ?time0 .
FILTER NOT EXISTS {
?track_ scmon:positionOf ?product ; scmon:atTime ?time_
FILTER (?time_ < ?time0)
}
}
順便說一句,如果您需要編號位置,請嘗試以下操作:
SELECT ?product ?track (COUNT(?track_) AS ?position) {
?track scmon:positionOf ?product ; scmon:atTime ?time .
?track_ scmon:positionOf ?product ; scmon:atTime ?time_
FILTER (?time >= ?time_)
} GROUP BY ?product ?track ORDER BY ?product ?position
至於 RDF 中的NULL
,見這個討論。 如果您真的希望明確表示它們,則可以使用以rdf:nil
結尾的rdf:List
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.