【发布时间】: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