如何在SPARQL上查询或组合一些查询?

时间:2014-11-18 17:58:27

标签: rdf sparql owl

我希望在SPARQL上创建一个查询,以查找创建日期优于警报的所有警报,该警报由_messageid =" 58002774-4fea-11e4-BDAC" (我不知道它的创建日期。)

我测试了下面的查询并且运行正常:

查询1:显示所有警报及其创建日期:

SELECT ?a ?ct
WHERE {
  ?a :CreateTimeSlot ?cts.
  ?cts :Text ?ct.
}

查询2:显示由_messageid =" 58002774-4fea-11e4-BDAC"

标识的警报的创建日期
SELECT ?a ?ct
WHERE {
  ?a :_messageid "58002774-4fea-11e4-bdac".
  ?a :CreateTimeSlot ?cts.
  ?cts :Text ?ct.
}

查询3:显示创建日期优于日期的所有提醒" 2014-10-09T15:15:00":

SELECT ?a ?ct
WHERE {
  ?a :CreateTimeSlot ?cts.
  ?cts :Text ?ct.
  FILTER ( xsd:dateTime(?ct) > xsd:dateTime("2014-10-09T15:15:00") ).
}

问题是我不知道如何将它们结合起来解决我的问题(查找创建日期优于由_messageid =" 58002774-4fea标识的警报的所有警报-11e4-BDAC"

我测试了一些不工作的请求(如下所述):

查询4:

SELECT ?a ?ct
WHERE {
  ?a :CreateTimeSlot ?cts.
  ?cts :Text ?ct.
  FILTER ( xsd:dateTime(?ct) > {SELECT ?ct2 WHERE { ?a2 :_messageid "58002774-4fea-11e4-bdac". ?a2 :CreateTimeSlot ?cts2. ?cts2 :Text ?ct2 } } )
}

查询5:

SELECT ?a ?ct
WHERE {
  ?a :CreateTimeSlot ?cts.
  ?cts :Text ?ct.
  FILTER ( xsd:dateTime(?ct) > xsd:dateTime({SELECT ?ct2 WHERE { ?a2 :_messageid "58002774-4fea-11e4-bdac". ?a2 :CreateTimeSlot ?cts2. ?cts2 :Text ?ct2 } }) )
}

查询6:

SELECT ?a
WHERE
{
  {
    SELECT ?a ?ct1
    WHERE
    {
      ?a :CreateTimeSlot ?cts.
      ?cts :Text ?ct1.
    }
    GROUP BY ?a 
  }.
  {
    SELECT ?a ?ct2
    WHERE
    {
      ?a :_messageid "58002774-4fea-11e4-bdac".
      ?a :CreateTimeSlot ?cts.
      ?cts :Text ?ct2.
    }
    GROUP BY ?a
  }.
  FILTER (xsd:dateTime(?ct1) > xsd:dateTime(?ct2)). 
}

1 个答案:

答案 0 :(得分:1)

更新

听起来您想要使用指定的messageId检索元素的创建日期,然后获取具有更晚创建日期的所有元素。就是这样:

SELECT ?a ?cts ?dc
WHERE {
  ?x :CreateTimeSlot ?y.
  ?y :_messageid "58002774-4fea-11e4-bdac".
  ?y :Text ?xdate.

  ?a :CreateTimeSlot ?cts.
  ?cts :Text ?dc.
  FILTER ( xsd:dateTime(?dc) > xsd:dateTime(?xdate) ).
}

可以使用一些空白节点清理一下:

SELECT ?a ?cts ?dc
WHERE {
  [] :CreateTimeSlot [ :_messageid "58002774-4fea-11e4-bdac" ;
                       :Text ?xdate ] .

  ?a :CreateTimeSlot ?cts.
  ?cts :Text ?dc.
  FILTER ( xsd:dateTime(?dc) > xsd:dateTime(?xdate) ).
}

如果您不需要?cts ,您可以像以前一样简化:

SELECT ?a ?cts ?dc
WHERE {
  [] :CreateTimeSlot [ :_messageid "58002774-4fea-11e4-bdac" ;
                       :Text ?xdate ] .

  ?a :CreateTimeSlot/:Text ?dc.
  FILTER ( xsd:dateTime(?dc) > xsd:dateTime(?xdate) ).
}

原始

如果我理解你要做什么,就是这样:

SELECT ?a ?cts ?dc
WHERE {
  ?a :CreateTimeSlot ?cts.
  ?a :_messageid "58002774-4fea-11e4-bdac".
  ?cts :Text ?dc.
  FILTER ( xsd:dateTime(?dc) > xsd:dateTime("2014-10-09T15:15:00") ).
}

关于text属性的值是否会被称为?dc ?ct ,有一点混淆,所以我选择 ?直流

但实际上有几种方法可以清理它。这只是一种风格问题,但我可能会将其写为(请注意;语法,以便在?a xsd:dateTime 比较中的文字):

SELECT ?a ?cts ?dc
WHERE {
  ?a :CreateTimeSlot ?cts ; 
     :_messageid "58002774-4fea-11e4-bdac".
  ?cts :Text ?dc
  FILTER ( xsd:dateTime(?dc) > "2014-10-09T15:15:00"^^xsd:dateTime )
}

如果您实际上不需要?cts 值,则可以进一步简化此操作:

SELECT ?a ?cts ?dc
WHERE {
  ?a :CreateTimeSlot/:Text ?dc ;
     :_messageid "58002774-4fea-11e4-bdac".
  FILTER ( xsd:dateTime(?dc) > "2014-10-09T15:15:00"^^xsd:dateTime )
}