图形分区算法与Neo4j图数据库

时间:2013-08-08 04:09:13

标签: graph neo4j partitioning metis

我知道有一些着名的图形分区算法工具,如METIS,由karypis Lab实现(http://glaros.dtc.umn.edu/gkhome/metis/metis/overview

但我想知道是否有任何方法来分割存储在Neo4j中的图形? 或者我必须转储Neo4j的数据并手动转换节点和边缘格式以适应METIS输入格式?

2 个答案:

答案 0 :(得分:8)

关于新的和有趣的算法,这绝不是详尽的或现有的,但这些是我看的第一个地方:

特定算法DiDiC (Distributed Diffusive Clustering) - 我在论文中使用了一次(Partitioning Graph Databases

  • 您遍历所有节点,然后为每个节点检索所有邻居,以便将“某些单位”传播给所有邻居
  • 易于实施。
  • 可以确定性
  • 迭代 - 因为它基于迭代(如Pregel中的Super Steps),您可以随时停止它。从理论上讲,离开它的时间越长,结果越好(尽管在某些情况下,在某些图形上它可能不稳定)
  • 当我们实现这一点时,我们在一台内存约为30GB的机器上进行了100次迭代,最多可达400万个节点 - 完成时间不超过两天。

特定算法EvoCut "Finding sparse cuts locally using evolving sets" - 来自Microsoft的本地概率算法 - related to these papers

  • 难以实施
  • 本地算法 - 类似BFS的访问模式(随机漫步)
  • 我阅读那篇论文已经有一段时间了,但我记得它建立在干净的抽象基础之上:
    • EvoNibble(可插入 - 决定要添加到当前群集的邻域数量
    • EvoCut(多次调用EvoNibble以查找本地群集)
    • EvoPartition(重复调用EvoCut以对整个图表进行分区)
  • 不确定

通用算法系列Hierarchical Graph Clustering

从高层次开始:

  • 通过将节点折叠为聚合节点来粗化图形
    • 粗化策略是可选择的
  • 在粗化/小图中查找群集
    • 可选择聚类策略
  • 逐步修饰图表,在每一步的聚类处进行细化
    • 可选择精炼策略

注意:

  • 如果图表变化缓慢(或结果不需要更新),可能会粗化一次(或不经常)然后使用粗化图表 - 以节省计算
  • 我不知道推荐的具体算法

一般限制 - 少数群集算法所做的事情:

  • 未确认的节点类型 - 即所有节点均等处理
  • 未确认的关系类型 - 即所有关系均等待
  • 未承认关系方向 - 即被视为无向的关系

答案 1 :(得分:4)

过去曾与METIS和Neo4j独立合作,我不知道有任何工具可以从Neo4j生成METIS文件。话虽这么说,编写这样一个工具应该是一项容易的任务,并且将是一个很好的社区贡献。

将METIS与Neo4j集成的另一种方法可能是通过JNI将METIS从C ++连接到Neo4j。然而,这将涉及更多,因为它必须处理事务,并发等事情。

关于分区图的更一般的问题,很有可能通过合理的努力实现一些更为人熟知和简单的算法。