如何基于主题在Java中分割RDF三元组

时间:2016-02-18 18:43:10

标签: java hash rdf hashcode triples

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

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

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

因此,具有相同主题的所有三元组将在一个分区中,并且总体上我们将具有10个分区。

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

有人有任何建议吗?

提前谢谢。

2 个答案:

答案 0 :(得分:3)

算法:

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

优点:

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

缺点:

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

如果您不关心在同一个分区中保留同一主题三元组,那么只需创建十个桶并将其填充为循环。 O(n)并尽可能平衡。

答案 1 :(得分:0)

您只需使用模数分割分区:

subject.hashCode() % 10

将在十个分区中或多或少地均匀分割。