在图和子图上表示并执行IO

时间:2018-07-18 10:53:03

标签: java data-structures graph relationship graph-traversal

我有一个需要在循环图上执行CRUD操作的问题。现在我知道那里有很多图数据库,但是我有一组特定的用例,这些用例在这些数据库中不被支持(或者至少我不知道它们)。

以下是我的构造:

  • 节点:可以有多个源和目标
  • 定向边缘:连接两个节点
  • 节点组:多个节点(与边连接)形成一个组(简单地说,它是一个较小的图)
  • 有向图:包含多个节点,节点组和边。图可以是循环的。

以下是我可以拥有的功能:

  • 我可以通过定义传入和传出边缘定义来简单地创建一个节点。
  • 我可以通过添加节点并将其与边连接来创建一个简单的图。
  • 我可以执行标准的图形遍历。
  • 我现在可以对图的节点进行分组,并将其称为 节点组 ,我可以在其中使用该节点组的多个实例(就像一个节点一样)另一个更大的图。这会创建复杂的层次结构。
  • 我可以创建多个图,这些图又可以使用上述任何一种构造。
  • 我可以更改“节点”和“节点组”定义,这意味着可以对图形进行结构更改。如果我对“节点”或“节点组”定义进行了更改,那么在所有图中的该节点的所有实例也应更新。

现在,我了解使用关系数据库可以最好地完成所有这些工作,这将确保关系完整无缺且查询简单。但是,当有复杂的图形并且要更新其中的多个图形时,性能会受到影响。

因此,我想知道是否存在一种混合/更好的方法来存储,检索和更新这些图,而这种方法比关系数据库要快得多。

任何想法都会很有帮助。预先感谢!

1 个答案:

答案 0 :(得分:1)

我不会淘汰图数据库。您可以使用满足您需求的额外属性/节点/连接来轻松构建缺少的功能。

例如为了创建一个组,您可以创建一个节点,该节点具有一个道具type:Group,该道具共享相同的groupId,而所有节点都属于该组。

另一种选择是使组成员与其GroupNode-belongsToGroup->GroupNode有更多联系。

在以上任何一种解决方案中,要将Node / Group连接到另一个Group,仅需要建立到Group节点的连接。

定义也是如此,例如Node-isOfType->DefinitionNode。然后updateDefinition将更新属于该Definition的所有节点。

基于上述情况,我认为创建如下所示的api很容易:

createGroup
isGroup
addNodesToGroup
createDefinition
updateDefinition
setNodeDefinition
getNodeDefinition

就可扩展性而言,您可以检查OrientDb:Distributed-Architecture / comparison to neo4j

  

...只有一个服务器可以作为主服务器,因此Neo4j的写吞吐量被限制为单个主服务器的容量。这意味着Neo4j无法扩展写入。

     相反,

OrientDB支持多主机+分片架构:所有服务器都是主机。吞吐量不受单个服务器的限制。使用OrientDB,全局吞吐量是所有服务器的吞吐量之和。

api参考: java api / sql ref