Neo4 SDN 4和计数器

时间:2017-06-25 13:16:07

标签: neo4j cypher spring-data-neo4j neo4j-ogm

为了在我的Neo4j SDN4应用程序中对数据进行语义化,我引入了totalChildDecisions计数器:

@NodeEntity
public class Decision {
    private Integer totalChildDecisions = 0; 
}

@Override
@Transactional
public Decision create(String name, String description, String url, String imageUrl, boolean downloadImage, Long parentDecisionId, User user) {

    Decision parentDecision = null;

    if (parentDecisionId != null) {
        parentDecision = lock(parentDecisionId, true);
    }

    decisionDaoValidator.validateDecisionAlreadyExistsByName(name, parentDecision);

    description = HtmlUtils.sanitizeHTML(description);

    Decision decision = createOrUpdate(new Decision(name, description, url, imageUrl, multiVotesAllowed, parentDecision, user), user);

    if (downloadImage) {
        updateImage(decision, imageUrl, downloadImage);
    }

    criterionGroupDao.create(CriterionGroupDaoImpl.DEFAULT_CRITERION_GROUP_NAME, null, decision, user);
    characteristicGroupDao.create(CharacteristicGroupDaoImpl.DEFAULT_CHARACTERISTIC_GROUP_NAME, null, decision, user);

    return decision;
}

lock方法调用以下存储库方法:

@Query("MATCH (d:Decision) WHERE d.id = {decisionId} SET d._lock = {lock} RETURN d")
Decision lock(@Param("decisionId") Long decisionId, @Param("lock") boolean lock);

我正在增加totalChildDecisions构造函数中的Decision计数器:

public Decision(String name, String description, String url, String imageUrl, Decision parentDecision, User author) {
    if (parentDecision != null) {

        addParentDecision(parentDecision);
        parentDecision.addChildDecision(this);

        parentDecision.setTotalChildDecisions(parentDecision.getTotalChildDecisions() + 1);
    }
}

createOrUpdate调用repository.save方法。

基于此代码,我将数据导入我的数据库。

现在我不明白为什么totalChildDecisions与我Neo4j数据库中的真实子决策号不同(例如我有2000个孩子的决定,但是每个数据导入后的计数器显示不同的值...就像1998年,1995年等)。如何正确获取parentDecision上的锁定以正确更新其totalChildDecisions计数器?

已更新

此外,当用户从UI请求Decision.totalViews时,我正在计算(增加额外的计数器)Decision。我正在阅读本决定中的Decision,增加totalViews计数器并保存此决定。如果并行作业(在上面的问题中描述)同时更新totalChildDecisions,我注意到我getDecision()方法的长时间响应,因为该决定被另一个作业锁定{{1在此作业完成之前无法更新getDecision()计数器。

考虑到这一点,最好更新totalViews计数器异步(例如从totalViews触发新事件并在ActiveMQ使用者处更新getDecision())阻止getDecision方法?

0 个答案:

没有答案