我使用Apache Jena的Java API来存储和检索文档及其中的单词。为此,我决定建立以下数据结构:
_dataset = TDBFactory.createDataset("./database");
_dataset.begin(ReadWrite.WRITE);
Model model = _dataset.getDefaultModel();
Resource document= model.createResource("http://name.space/Source/DocumentA");
document.addProperty(RDF.value, "Document A");
Resource word = model.createResource("http://name.space/Word/aword");
word.addProperty(RDF.value, "aword");
Resource resource = model.createResource();
resource.addProperty(RDF.value, word);
resource.addProperty(RSS.items, "5");
document.addProperty(RDF.type, resource);
_dataset.commit();
_dataset.end();
上面的代码示例代表一个文档("文档A"),由五(5)个单词组成(" aword")。计算文档中单词的出现并将其存储为属性。单词也可以出现在其他文档中,因此与特定文档中的特定单词相关的出现计数由空白节点链接在一起。 (我不完全确定这种结构是否有意义,因为我对这种存储信息的方式还很新,所以请随时提供更好的解决方案!)
我的主要问题是:如何获得所有不同单词的列表以及它们在所有文档中出现的总和?
答案 0 :(得分:2)
在我看来,您的数据模型有点不同寻常。使用您的代码,您最终会得到这样的数据(以Turtle表示法),并以非常规方式使用 rdf:type 和 rdf:value :< / p>
:doc rdf:value "document a" ;
rdf:type :resource .
:resource rdf:value :word ;
:items 5 .
:word rdf:value "aword" .
这很不寻常,因为通常你不会在资源的type属性上有这么复杂的信息。但是从SPARQL的角度来看, rdf:type 和 rdf:value 就像其他任何属性一样,您仍然可以通过简单的查询检索您正在寻找的信息。它看起来或多或少会像这样(虽然你需要定义一些前缀等):
select ?word (sum(?n) as ?nn) where {
?document rdf:type ?type .
?type rdf:value/rdf:value ?word ;
:items ?n .
}
group by ?word
该查询将为每个单词生成结果,并且每个单词将是与该单词关联的:items 属性的所有值的总和。 Stack Overflow上有很多关于使用Jena运行SPARQL查询的例子。例如,(我在谷歌发现的第一个):Query Jena TDB store。