java - 如何在Java中根据主题划分RDF三元组

标签 java hash rdf hashcode triples

为了按主题对 RDF 三元组进行分区,我使用主题的 String.hashCode() 并将三元组放入相应的分区中。目标是能够处理内存中的分区文件(处理大文件可能无法)。

现在为了限制数量的分区,我执行以下操作。假设我们想要在一个大的 RDF 文件中拥有 10 个分区:

    String subject; 
    partitionFileName = subject.hashCode / (Integer.MAX_VALUE/10)

因此,具有相同主题的所有三元组将位于一个分区中,总共我们将有 10 个分区。

现在的问题是,当三元组具有不同的分布时,可能会导致非常大或非常小的分区,这是不希望的。

有人有什么建议吗?

提前谢谢您。

最佳答案

算法:

  • 为每个主题创建一个分区(这可以在 RDF 处理期间即时完成)
  • 对于每个三元组,根据主题将其分配给分区并记住主题-分区映射
  • 当分区数 > 10 时,合并两个最小的分区并更新 map

优点:

  • 确保具有相同主题的所有三元组位于同一分区中
  • 只要您的数据不是非常不平衡,就可以保持平衡
  • 如果您不想,则不必使用哈希码

缺点:

  • 额外的处理时间,尽管数量并不繁重;这是 O(n * m),其中 n 是三元组的数量,m 是不同主题的数量
  • 如果您的数据非常不均匀,则分区大小不同,但这是不可避免的,因为您希望具有相同主题的所有三元组位于同一分区中
  • 您必须维护映射才能执行查找,但这最终是微不足道的,而且是一个恒定时间的操作

如果您不关心在单个分区中保留相同主题的三元组,则只需创建十个存储桶并循环填充它们即可。 O(n) 并尽可能平衡。

关于java - 如何在Java中根据主题划分RDF三元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35489838/

相关文章:

java - Spring Data 未提交给 DB

java - 如何使用 BouncyCaSTLe 计算消息摘要?

rdf - 在本体中插入多个个体

java - mysql查询的复用

java - 设置套接字操作的超时

java - 在 firebase (JAVA) 中插入字符串变量作为键(子)

c# - SQLite : how? 中的 SHA1 哈希

c++ - std::unordered_map 如何确定哈希表中特定键的位置?

rdf - 如何获取sparql查询结果的所有解引用链接

rdf - 一个 SPARQL 查询来获取我的披萨名称