gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:44:22 24 4
gpt4 key购买 nike

我有一个以 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;
}

}

}
}

它正在运行并在 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 - 有没有更好的方法来为图数据库建模我的实体和关系(使用 gremlin)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58716511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com