我希望在SPARQL上创建一个查询,以查找创建日期优于警报的所有警报,该警报由_messageid =" 58002774-4fea-11e4-BDAC" (我不知道它的创建日期。)
我测试了下面的查询并且运行正常:
SELECT ?a ?ct
WHERE {
?a :CreateTimeSlot ?cts.
?cts :Text ?ct.
}
SELECT ?a ?ct
WHERE {
?a :_messageid "58002774-4fea-11e4-bdac".
?a :CreateTimeSlot ?cts.
?cts :Text ?ct.
}
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" )
我测试了一些不工作的请求(如下所述):
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 } } )
}
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 } }) )
}
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)).
}
答案 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 )
}