0

使用 SDN 2.1.0.BUILD-SNAPSHOT

是否有执行 getOrCreate 的域级线程安全方式?

我有

@NodeEntity
public class ResourceEntity  extends Entity {

@Fetch
@Indexed(unique=true)
String url;

@Fetch
String platform;
}

我想要的是能够访问neo4j REST数据库,并添加一个新的ResourceEntity,或者已经在那里检索一个,如果已经有一个具有指定url字段的...

我找不到的是一种以原子方式执行此操作的方法。它需要以原子方式工作,因为将有多个线程调用此代码。

neo4jTemplate.save(resourceEntity);

如果我尝试插入具有重复键的 ResourceEntity,则抛出(应该如此) org.springframework.dao.DataIntegrityViolationException,但在域级别的 Neo4jTemplate 上公开的是 getOrCreate,这正是我想要的。我如何在SDN中实现这一点而不必做一些不整洁的事情

Map<String, Object> properties = new HashMap<String, Object>();
properties.put("url", url);
properties.put("__type__", "com.mydomain.analysis.thingie.dao.ResourceEntity");

Node node = neo4jTemplate.getOrCreateNode("ResourceEntity", "url", "url", properties);

...然后从存储库或类似的东西中拉回新的 ResourceEntity ......讨厌!(我没有测试过,但我认为这会起作用) - 但它非常难看!

4

1 回答 1

0

你有没有找到你的问题的答案?我们面临着类似的问题,实际上已经实现了您提出的解决方法:一个 getOrCreate 函数,它尝试使用存储库 findByPropertyValue 函数从图中检索节点/边。如果没有找到节点/边,则创建一个新的。

此解决方法的问题在于,使用例如单独的 JSON 调用调用 getOrCreate 函数会导致执行不同的 getOrCreate 事务。如果这些不同的事务在节点/边缘方面重叠,则如果事务同时运行,则会创建重复的节点/边缘。

处理这种副作用的一种方法是对节点/边缘唯一 ID 使用唯一索引:@Indexed(unique = true)

尽管这似乎是一个更大的解决方法。

Neo4j/Spring/SDG 人员的任何想法/最佳实践?

于 2012-12-24T09:31:58.497 回答