多个孤立图的数据库解决方案

时间:2018-01-02 14:55:52

标签: neo4j graph-databases

我有一个有趣的问题,我不知道如何解决。 我已经收集了一个包含8000万个图形的大型数据集(它们是我从Github分析的程序生成的控制流图中的CFG),我需要能够有效地进行搜索。 我查看了像Neo4j这样的现有解决方案,但它们都设计用于存储全局单个图形。 在我的情况下,相反所有图形都是表中独立的行 - 但我需要有效地搜索所有这些行。 例如,我想找到具有特定IF条件的所有CFG或具有特定条件的WHILE循环。 什么是这个用例的最佳数据库?

1 个答案:

答案 0 :(得分:1)

我不认为有理由不将所有这些图表存储在单个图表中,无论是Neo4j还是其他图表数据库。在单个图表中包含许多不同的图表并不是一个问题,其中不同的图表彼此断开连接。

至于有效搜索它们,您可以(1)识别要搜索的CFG中的属性并将它们转换为图形的某个索引值,或者(2)引入一些图形结构(附加顶点/边缘)在CFG之间允许您通过图遍历进行所需的搜索。

根据您需要在方法1上搜索的内容,对于您来说可能不够灵活,特别是如果您在搜索的内容在加载数据时并不完全已知。此外,重要的是要注意,使用方法2,您并没有真正失去这样一个事实,即您有8000万个不同的图表,因为您在它们之间提供了一些连接。这些物理联系不会改变这个基本的逻辑事实。当您编写期望仅在单个CFG中发生的遍历时,您只需要考虑这些附加连接。

我不确定Neo4j在这个领域支持什么,但是使用Apache TinkerPop(一个开源图形处理框架,允许您在不同的图形数据库上编写供应商不可知的代码,包括Neo4j),您可能会考虑做某种形式的graph partitioning以帮助处理方法2.或者你可以subgraph()较大的图只包含CFG,然后在查询时纯粹在内存中操作。这两种方法都可以帮助您将查询视为您想要遍历的单个CFG。

但是,最终,我将此问题视为建模问题。您只需要为如何最好地为您的用例建立架构做出一些选择,几乎任何图形数据库都应该能够支持它。