我有一个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
答案 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
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)
}
}