微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有 ORDER BY 和 GROUP BY

如何解决带有 ORDER BY 和 GROUP BY

尊敬的 RDF/SPARQL 社区:

我的目标是通过SPARQL构建一个按产品分组、按时间排序的有序列表来展示一个产品的轨迹。我正在使用 GraphDB,“scmon”是我的自定义本体。以下是详细信息:

我存储了 RDF 数据,其中包含产品的时间戳 (scmon:atTime) 和位置 (scmon:atLocation)。在 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 条目都通过 product 关系分配给一个 scmon:positionOf

我现在的目标是通过 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 指向 ?netPos 找到的第一个位置 (min(?time))...

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

...但是我怎么能从那里继续呢?我尝试了一些 SPARQL SELECT 查询来测试我是否可以选择构建 scmon:nextPosition 关系所需的信息,但没有成功。

是否可以构建这种模式?还是我必须以某种方式更改我的初始 RDF 数据模型?

提前感谢您的提示

解决方法

这样:

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,参见 this discussion。如果您确实希望明确表示它们,则可以使用以 rdf:List 结尾的 rdf:nil

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?