删除所有关于活动时间的三元组,除了最早的活动时间

时间:2017-06-30 14:27:58

标签: sparql rdf

我有几个像这样的三元组

:event1 :hasTimeStamp "2017-06-30T00:01:00Z" .
:event1 :hasTimeStamp "2017-06-30T00:02:00Z" .
:event1 :hasTimeStamp "2017-06-30T00:03:00Z" .

除了最早的,我想删除关于:event1的{​​{1}}的所有断言。

我知道如何选择最早的,将其插入一个临时命名图,删除所有timestamp :event1,然后从暂存图中复制回来。

有没有办法在没有利用临时/临时图的情况下进行删除?

这是一个嵌套选择,其中内部子选择获得最小时间,然后将其与外部选择的单个时间进行比较。

现在我只需要将其包含在timestamp

delete

3 个答案:

答案 0 :(得分:3)

试试这个(不在生产​​环境中):

PREFIX  rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

DELETE {
  ?s <http://purl.obolibrary.org/obo/IAO_0000004> ?o2 .
}
WHERE { 
  ?s <http://purl.obolibrary.org/obo/IAO_0000004> ?o2 .
  ?s rdf:type <http://turbo.org/procStartTimeMeas> .
  FILTER EXISTS {
  ?s <http://purl.obolibrary.org/obo/IAO_0000004> ?o1 .
  ?s rdf:type <http://turbo.org/procStartTimeMeas> .
  FILTER (?o2 > ?o1)
  }   
}

我不确定我是否正确理解这些谓词的含义。

我认为<http://purl.obolibrary.org/obo/IAO_0000004>是初始示例的:hasTimeStamp 在我的回答中,?s rdf:type <http://turbo.org/procStartTimeMeas>是唯一的选择标准。请添加其他标准。

答案 1 :(得分:3)

(@StansilavKralin的优秀解决方案的替代方案)

我刚刚根据样本数据

完成了这项工作
@prefix : <http://example.org/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
:event1 :hasTimeStamp "2017-06-30T00:01:00Z"^^xsd:dateTime .
:event1 :hasTimeStamp "2017-06-30T00:02:00Z"^^xsd:dateTime .
:event1 :hasTimeStamp "2017-06-30T00:03:00Z"^^xsd:dateTime .

不确定这是否是你想要的,但至少它非常紧凑,而且我是MINUS的忠实粉丝,它至少更具人性化(但性能可能更低):

PREFIX : <http://example.org/>
DELETE {
  ?event :hasTimeStamp ?ts .
}
WHERE
  { ?event  :hasTimeStamp  ?ts
    MINUS
      { { SELECT  ?event (MIN(?_ts) AS ?ts)
          WHERE
            { ?event  :hasTimeStamp  ?_ts }
          GROUP BY ?event
        }
      }
  }

答案 2 :(得分:1)

我认为这符合我的要求,但我希望看到其他人的建议。我不想随意删除。

PREFIX  rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
DELETE {
  ?s <http://purl.obolibrary.org/obo/IAO_0000004> ?o .
}
WHERE
  { SELECT  *
    WHERE
      { ?s        rdf:type              <http://turbo.org/procStartTimeMeas> ;
                  <http://purl.obolibrary.org/obo/IAO_0000136>  ?something .
        ?something  <http://purl.obolibrary.org/obo/RO_0002223>  ?another .
        ?another  rdf:type              <http://turbo.org/R2RInstantiation> .
        ?s        <http://purl.obolibrary.org/obo/IAO_0000004>  ?o
        { SELECT  ?s (MIN(?o) AS ?earliest)
          WHERE
            { ?s        rdf:type              <http://turbo.org/procStartTimeMeas> ;
                        <http://purl.obolibrary.org/obo/IAO_0000136>  ?something .
              ?something  <http://purl.obolibrary.org/obo/RO_0002223>  ?another .
              ?another  rdf:type              <http://turbo.org/R2RInstantiation> .
              ?s        <http://purl.obolibrary.org/obo/IAO_0000004>  ?o
            }
          GROUP BY ?s
        }
        FILTER ( ?o != ?earliest )
      }
  }