【问题标题】:Delete all triples about event time except earliest event time删除所有关于事件时间的三元组,除了最早的事件时间
【发布时间】:2017-06-30 14:27:58
【问题描述】:

我有几个这样的三元组

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

我想删除所有关于:event1timestamp 的断言,最早的除外。

我知道如何选择最早的,将其插入一个名为graph的scratch中,删除所有:event1timestamps,然后从scratch graph中复制回来。

有没有办法在不使用临时/临时图的情况下就地删除?

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

现在我只需要将它包装在 delete 中。

PREFIX  rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
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 )
  }

【问题讨论】:

    标签: sparql rdf


    【解决方案1】:

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

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

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

    我想&lt;http://purl.obolibrary.org/obo/IAO_0000004&gt; 是初始示例的:hasTimeStamp
    在我的回答中,?s rdf:type &lt;http://turbo.org/procStartTimeMeas&gt; 是唯一的选择标准。请添加其他条件。

    【讨论】:

    • 谢谢。我没有测试过这个,但我想我明白你的意思。我当然没想到有人会重写所有的三元组模式。
    • 顺便说一句,你能想到你的 FILTER EXISTS 方法与我的子查询相比有什么优点或缺点吗?
    • @MarkMiller,我只是无法理解您的查询(尽管很可能是正确的)。部分原因是我不熟悉 obolibrary.org 和 turbo.org 本体,而且您的查询很长。至于性能考虑,应该测试或查看执行计划……也许,各个 SELECT 查询的 SPARQL 代数表示会很有用。
    • 目前地球上只有5个人熟悉turbo本体!
    • 忽略我在三重模式中有更多约束的事实,这种方法似乎确实可以进行所需的删除。
    【解决方案2】:

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

    【讨论】:

    • 谢谢...时机不好。我刚刚接受了@Stanislav 的回答。我现在试试你的,然后告诉你。
    • 也可以。它并不比其他慢。
    • 别担心,我只是想试试看。谢谢你让我知道它有效。我想这更像是我在这里使用的 SQL 方式,其中MINUS 比 SPARQL 的相当简洁的EXISTS 功能更常见。干杯
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 2020-07-12
      相关资源
      最近更新 更多