我项目的一部分是在ntriples中索引s-p-o,我需要一些帮助,以弄清楚如何确切地通过java(或其他语言((如果可能的话(。
问题语句:我们有大约10个文件,其中包含" .ntriple"的扩展名。每个文件至少具有10K三元组。该文件的格式是多个RDF Triples
<subject1_uri> <predicate1_uri> <object1_uri>
<subject2_uri> <predicate1_uri> <object2_uri>
<subject2_uri> <predicate1_uri> <object3_uri>
…..
…..
我需要执行的是,索引这些主题,谓词和对象,以便我们可以快速搜索并检索诸如"给我所有主题和对象的predicate1_uri"等查询。
等等。我尝试使用此示例尝试了一下,但是我发现这是在进行全文搜索。这似乎并不有效,因为Ntriple文件可能大于每个文件50MB。
然后,我想到不进行全文搜索,而只是将s-p-o作为索引文档存储,每个(s,p,o(作为一个文档字段,带有另一个字段(相应的ntriple文件中的S-p-o的偏移((。
我有两个问题:
- Lucene是我要实现的唯一选择吗?
- 索引文件本身的大小会大于数据本身的一半吗?!
任何人都非常感谢。
回答您的第一个问题:不,Lucene不是唯一这样做的选择。您可以(而且可能应该(使用任何通用的RDF数据库来存储三元组。然后,您可以使用其Java API或使用SPARQL查询三元组。我个人推荐Apache Jena作为Java API与RDF合作。
如果您需要在数据集中的文字中进行自由文本搜索,则通过Jena Text与Apache Jena进行了Lucene集成。
关于索引大小,这完全取决于数据的熵。如果您的Ntriple文件中有40,000行,但这都是相同三元组的复制,那么索引将相对较小。但是,通常,RDF数据库对数据进行多个索引,您会看到尺寸增加。
此索引的主要好处是,您可以提出更多的通用问题,而不是"给我所有主题和对象predicate1_uri"。这个问题可以通过线性处理所有NTriple文件来回答,甚至不知道您使用RDF。以下类似SPARQL的查询显示了这些数据存储促进的更困难搜索的示例:
SELECT DISTINCT ?owner
WHERE {
?owner :owns ?thing
?thing rdf:type/rdfs:subClassOf :Automobile
?thing :hasColor "red"@en
}
在上一个查询中,我们找到一辆汽车或任何更具体的汽车议法的所有者,只要该东西的颜色是"红色"(用英语指定(。