【问题标题】:Is there a better way to model my entities and relations for a graph db (using gremlin)?有没有更好的方法来为图形数据库(使用 gremlin)建模我的实体和关系?
【发布时间】:2019-11-07 03:23:19
【问题描述】:

我有一个以 Java 为实体和关系的数据建模。每个实体都有一个关系列表。我们即将到来的请求可以通过需要在 GraphDB(使用 Neptune)中创建的实体请求获得一个实体列表,并使用 gremlin 访问它。 我必须遍历实体列表一次以在图中创建顶点,然后再次遍历实体,同时遍历每个关系以根据关系创建边。 这不是处理这个问题的最优雅的方式,那么有没有办法可以优化我的数据模型和/或 gremlin 查询?请参阅下面的代码以供参考。

public class EntityRequest{
  Set<Entity> entities;
  // getter
  // builder
  // constructors etc
}
public class Entity{
  String id;
  String entityType;
  List<String, Object> attributes;
  List<Relationship> relationships;
  // getter
  // builder
  // constructors etc
}
public class Relationship{
  String id;
  String type;
  Map<String, Object> RelationshipMetaData;
}
public EntityCreationServiceImpl{
  public void createEntitiesinGraph(EntityRequest request, GraphTraversalSource g){

    // any kind of loop
    Set<Entity> eSet = request.getEntities();
    loop-through-entities(e) -> {
      create all vertices using e;
    };

    // any kind of loop
    loop-through-entities(e) -> {
      loop-through-list-of-relationships-for-each-entity(r) ->{
        create all edges for e;
      }

    }

  }
}

它正在运行并在海王星数据库中创建实体,但如您所见,它并未优化性能。有没有更好的方法来做到这一点?

【问题讨论】:

  • 关系目标顶点是否已经存在于数据库中?有没有办法对实体进行排序,以便后面的实体只引用前面的实体?您要添加多少实体?
  • 目标顶点可能存在也可能不存在于数据库中,如果它们不存在,则该顶点或实体的数据将位于同一请求有效负载中。我最初的想法是按照每个实体内的关系列表大小的升序对实体进行排序,即自下而上创建图表。这可能是一种可能的解决方案,但如果我们是批量加载,那么排序将非常昂贵。至于我们要添加多少个实体,通常每次 rn 大约有 6-10 个,但我们可以引入批量加载,因此它也可以用于 10,000 个实体。

标签: java data-modeling graph-databases gremlin


【解决方案1】:

对于 10k 个实体,我会使用 Neptune bulk loader,它从 s3 获取 csv 文件,并有效地将其上传到 Neptune。在您的情况下,流程是 - 将实体序列化为 csv,上传到 s3,然后调用加载 api。

但是,对于通常有多个条目的情况,这可能是一种矫枉过正。

由于数据库可能已经有一些顶点,您应该使用合并,来搜索顶点是否存在或创建它。您可以在同一个查询中链接边缘创建,如果不存在,则可以选择创建边缘目标顶点:

g.V().has(foo,bar).fold().coalesce(unfold(),addV(type).property(foo,bar)).as('v')
.addE().from('v').to(V().has(...).fold().coalesce(unfold(),addV(...))
.addE().from('v').to(V().has(...).fold().coalesce(unfold(),addV(...))

这样,您只需迭代条目一次,并执行 n 次查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 2019-03-19
    • 2020-03-26
    相关资源
    最近更新 更多