有没有更好的方法来为图形数据库(使用 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 个查询。
我有一个基于 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 个查询。