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

Rdf 如何在SPARQL上子查询或组合一些查询?,rdf,sparql,owl,Rdf,Sparql,Owl,我希望在SPARQL上创建一个查询,以查找创建日期优于由_messageid=“58002774-4fea-11e4-BDAC”(我不知道其创建日期)标识的警报的所有警报 我测试了下面的查询,结果很好: 查询1:显示所有警报及其创建日期: 查询2:显示由_messageid=“58002774-4fea-11e4-BDAC”标识的警报的创建日期: 查询3:显示创建日期优于日期“2014-10-09T15:15:00”的所有警报: 问题是我不知道如何组合它们来解决我的问题(查找创建日期优于由_me

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

我测试了下面的查询,结果很好:

查询1:显示所有警报及其创建日期: 查询2:显示由_messageid=“58002774-4fea-11e4-BDAC”标识的警报的创建日期: 查询3:显示创建日期优于日期“2014-10-09T15:15:00”的所有警报: 问题是我不知道如何组合它们来解决我的问题(查找创建日期优于由_messageid=“58002774-4fea-11e4-BDAC”标识的警报的所有警报)

我测试了一些请求(如下所述),它们不起作用:

问题4: 问题5: 问题6: 更新 听起来您希望检索具有指定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 {
  ?a :CreateTimeSlot ?cts.
  ?a :_messageid "58002774-4fea-11e4-bdac".
  ?cts :Text ?dc.
  FILTER ( xsd:dateTime(?dc) > xsd:dateTime("2014-10-09T15:15:00") ).
}
可以使用一些空白节点稍微清理:

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 {
  ?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 {
  ?a :CreateTimeSlot ?cts.
  ?a :_messageid "58002774-4fea-11e4-bdac".
  ?cts :Text ?dc.
  FILTER ( xsd:dateTime(?dc) > xsd:dateTime("2014-10-09T15:15:00") ).
}
关于文本属性的值是被称为?dc还是?ct,有点混淆,所以我选择了?dc

不过,实际上有几种方法可以解决这个问题。这只是风格问题,但我可能会这样写(注意
语法选择?a上的多个属性,比较中的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 )
}

感谢您展示了有效的查询和无效的尝试。不过,我建议您以后可以查看帮助中心的页面。感谢您的帮助Joshua,但问题是我不知道警报的创建日期,即消息ID为“58002774-4fea-11e4-bdac”,因此我无法使用您的第一个代码。那么对于你关于?dc和?ct的问题,它们代表相同的东西,我刚刚更改了变量的名称。@azedra在最后的查询中你到底想得到什么?“显示所有警报及其创建日期”和“显示由_messageid=“58002774-4fea-11e4-BDAC”标识的警报的创建日期”都没有意义。你到底想要什么?要显示创建日期在“58002774-4fea-11e4-BDAC”创建日期之后的所有条目?
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) ).
}
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") ).
}
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 )
}
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 )
}