SPARQL中的拆分、排序和连接

SPARQL中的拆分、排序和连接,sparql,Sparql,假设我有一个RDF图,它表示论坛中的评论: PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX forum: <http://example.com/> PREFIX comment: <http://example.com/comment/> PREFIX meta: <http://example.com/meta/> comment:1 a

假设我有一个RDF图,它表示论坛中的评论:

PREFIX rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX forum:  <http://example.com/>
PREFIX comment:  <http://example.com/comment/>
PREFIX meta: <http://example.com/meta/>

comment:1 a            forum:comment ;
       meta:created    "1234" ;
       meta:text       "comment 1" ;
       meta:commenter  "John" .

comment:2 a            forum:comment ;
       meta:created    "1256" ;
       meta:text       "comment 2" ;
       meta:commenter  "James" .

comment:3 a            forum:comment ;
       meta:created    "1267" ;
       meta:text       "comment 3" .
       meta:commenter  "John" .

comment:4 a            forum:comment ;
       meta:created    "1289" ;
       meta:text       "comment 4" ;
       meta:commenter  "James" .
前缀rdf:
前缀论坛:
前缀注释:
前缀元:
评论:1论坛:评论;
元:创建“1234”;
meta:文本“评论1”;
梅塔:评论员“约翰”。
评论:2论坛:评论;
元:创建“1256”;
meta:文本“评论2”;
梅塔:评论员“詹姆斯”。
评论:3论坛:评论;
meta:创建“1267”;
meta:文本“评论3”。
梅塔:评论员“约翰”。
评论:4论坛:评论;
元:创建“1289”;
meta:文本“评论4”;
梅塔:评论员“詹姆斯”。
是否可以使用SPARQL查询提取每个
注释者的最新注释


因此,我们必须按评论者对数据进行分割,然后按
创建的
在每个排序中对数据进行分割,然后取每组中最新的数据并将它们连接在一起。但我不知道如何在SPARQL中做到这一点。

类似的东西可能

SELECT ?commenter ?text
WHERE {

   ?comment a            forum:comment ;
       meta:created   ?createdId ;
       meta:text      ?text .

  {
   SELECT (xsd:string(max(?id)) as ?createdId) ?commenter
   WHERE {
     ?comment a            forum:comment ;
       meta:created    ?created ;
       meta:commenter  ?commenter .
     BIND(xsd:integer(?created) as ?id)
   }
   GROUP BY ?commenter
 }
}

如果我是你,我会根据你想问的问题重写本体论。

类似的东西可能

SELECT ?commenter ?text
WHERE {

   ?comment a            forum:comment ;
       meta:created   ?createdId ;
       meta:text      ?text .

  {
   SELECT (xsd:string(max(?id)) as ?createdId) ?commenter
   WHERE {
     ?comment a            forum:comment ;
       meta:created    ?created ;
       meta:commenter  ?commenter .
     BIND(xsd:integer(?created) as ?id)
   }
   GROUP BY ?commenter
 }
}

如果我是你,我会根据你想要询问的查询重写本体。

如果
created
的值总是整数值,你应该在RDF数据中声明,即
meta:created 1267
或更详细的形式
meta:created“1267”^^xsd:integer
SELECT*{?commenter^ meta:commenter[meta:created?created;meta:text?text]过滤器不存在{?commenter^ meta:commenter[meta:created?created?FILTER(xsd:integer(?created)>xsd:integer(?created))}
@Stanislav请将您的评论输入一个答案,以便我可以将其标记为正确。谢谢这个问题被问了很多次,也被回答了很多次。也许“我的”查询更通用,但是@Karima的查询可能有更好的性能。因此,请接受她的回答:-)。如果
created
的值始终是整数值,则应在RDF数据中声明,即
meta:created 1267
或更详细的形式
meta:created“1267”^^xsd:integer
SELECT*{?commenter^ meta:commenter[meta:created?created;meta:text?text]过滤器不存在{?commenter^ meta:commenter[meta:created?created?FILTER(xsd:integer(?created)>xsd:integer(?created))}
@Stanislav请将您的评论输入一个答案,以便我可以将其标记为正确。谢谢这个问题被问了很多次,也被回答了很多次。也许“我的”查询更通用,但是@Karima的查询可能有更好的性能。所以请接受她的回答:-)。谢谢你的帮助!不过,上面评论中的Stanislav答案对我的用例更有效。谢谢你的帮助!然而,上面评论中的Stanislav答案对我的用例更有效。