有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在图和子图上表示和执行IOs的java

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

以下是我的构想:

  • 节点:可以有多个源和目标
  • 定向边:连接两个节点
  • 节点组:多个节点(通过边连接)组成一个组(简单地说,这是一个较小的图形)
  • 有向图:由多个节点、节点组和边组成。图可以是循环的

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

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

现在我知道,所有这些都可以通过关系数据库来实现,关系数据库将确保关系完整,查询简单。但是,当存在复杂的图形并且需要更新其中的多个图形时,性能将受到影响

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

任何想法都会非常有用。提前谢谢


共 (1) 个答案

  1. # 1 楼答案

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

    例如,为了创建一个组,您可以创建一个节点,其中包含一些属性type:Group,这些属性与属于该组的所有节点共享相同的groupId

    另一种选择是让组成员与他们的Group:Node-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

    ...only one server can be the master, so the Neo4j write throughput is limited to the capacity of the single Master server. This means that Neo4j isn’t able to scale on writes.

    OrientDB, instead, supports a Multi-Master + Sharded architecture: all the servers are masters. The throughput is not limited by a single server. With OrientDB, the global throughput is the sum of the throughput of all the servers.

    api参考: java api/sql ref