SPARQL查询,删除具有不同ID的相同标题的文章

时间:2017-05-06 15:15:25

标签: sparql

我有一个SPARQL查询,可以选择唯一的文章ID。

SELECT DISTINCT  ?document 
 WHERE
 { 
   ?obj sem:is_referred_in__document ?doc .
   ?obj ann:label_lemma "lemma"@en .
   ?doc sem:document_ID ?document .
 } LIMIT 40

工作正常,但问题是我的数据存储是一些具有不同ID的相同文章,但具有相同的标题,所以我只需要一篇文章副本。我可以访问文章标题:

?doc  rdfs:label ?label

所以我试过这个:

SELECT DISTINCT  ?document ?label
 WHERE
 { 
   ?obj sem:is_referred_in__document ?doc .
   ?obj ann:label_lemma "lemma"@en .
   ?doc sem:document_ID ?document .
   ?doc rdfs:label ?label
 } LIMIT 40

这仍然会给我带来与frist查询相同的结果。有什么建议我做错了什么?作为我未来流程的回报,我只需要ID

1 个答案:

答案 0 :(得分:1)

至少有两种方法可以稍微修改您的第二个查询,使其更符合您的需求:

使用GROUP BY

SELECT ?label  (sample(?document) AS ?id)
WHERE
   { ?obj sem:is_referred_in__document ?doc .
     ?obj ann:label_lemma "lemma"@en .
     ?doc sem:document_ID ?document .
     ?doc rdfs:label ?label 
   } GROUP BY ?label

使用FILTER NOT EXISTS

SELECT ?label ?document
WHERE
    { ?obj sem:is_referred_in__document ?doc .
      ?obj ann:label_lemma "lemma"@en .
      ?doc sem:document_ID ?document .
      ?doc rdfs:label ?label .
      FILTER NOT EXISTS
      { ?doc1 sem:document_ID ?document1 .
        ?doc1 rdfs:label ?label .
        FILTER (document1 > document)
      } 
    }

我认为,这些查询都是不言自明的......

也许你也可以整理你的三元商店,以这种方式替换对重复文章的引用(未经测试):

DELETE
  { ?obj sem:is_referred_in__document ?doc1 
  }
INSERT
  { ?obj sem:is_referred_in__document ?doc2
  }
WHERE
   { ?obj sem:is_referred_in__document ?doc1 .
#    ?obj sem:is_referred_in__document ?doc2 .
     ?doc1 sem:document_ID ?document1 .
     ?doc2 sem:document_ID ?document2 .
     ?doc1 rdfs:label ?label .
     ?doc2 rdfs:label ?label .
     FILTER NOT EXISTS
     { ?doc3 sem:document_ID ?document3 .
       ?doc3 rdfs:label ?label .
       FILTER (document3 > document2)
     } 
}