有没有更好的方法来为图形数据库(使用 gremlin)建模我的实体和关系?

Is there a better way to model my entities and relations for a graph db (using gremlin)?

我有一个基于 Java 建模的数据作为实体和关系。每个实体都有一个关系列表。我们即将到来的请求可以通过需要在 GraphDB(使用 Neptune)中创建并使用 gremlin 访问的实体请求进入实体列表。 我必须遍历实体列表一次以在图中创建顶点,然后再次遍历实体,同时遍历每个关系以根据关系创建边。 这不是处理此问题的最优雅方式,那么有没有一种方法可以优化我的数据模型 and/or 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;
      }

    }

  }
}

它正在 neptune 数据库中工作并创建实体,但如您所见,它并未进行性能优化。有更好的方法吗?

对于 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 个查询。