繁体   English   中英

通过REST进行Spring Neo4j批处理

[英]Spring Neo4j batch over REST

我在独立模式下使用Neo4j,在我的应用程序中使用Spring Data for Neo4j。 我的代码必须能够确保当我尝试保存对象时,一切都进行了,否则什么也没做。 我知道Spring Neo4j中的REST不支持事务,但是Neo4j的REST API中的批处理操作应该可以满足我当前的需求。 没有太多的操作,但是整个save()调用需要全部解决。

但是,Spring默认情况下似乎不执行此操作。 如果在写入过程中发生RuntimeException,则数据库中仍将放置一些部分数据。 我想继续使用GraphRepository接口,但是如果这不可能,我想我可以手动实现。

这是一些简化的示例代码,以说明发生了什么

POJO

@NodeEntity
public class TestObject {
  @GraphId
  private Long id;
  private String name;

  @Fetch
  @RelatedTo(type = "SIBLING_OF", direction = Direction.BOTH)
  private Set<TestObject> siblings;

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getName() {
    if (name == "fail") {
      throw new RuntimeException();
    }
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Set<TestObject> getSiblings() {
    return siblings;
  }

  public void setSiblings(Set<TestObject> siblings) {
    this.siblings = siblings;
  }
}

资料库

public interface TestRepository extends GraphRepository<TestObject>{}

测试

public class Test {
  @Autowired
  TestRepository repo;

  public void run() {
    final TestObject o1 = new TestObject();
    o1.setName("good1");

    final TestObject o2 = new TestObject();
    o1.setName("good2");

    final TestObject o3 = new TestObject();
    o1.setName("good3");

    final TestObject o4 = new TestObject();
    o1.setName("fail");

    o1.setSiblings(new HashSet<TestObject>() {{
      add(o2);
      add(o3);
      add(o4);
    }});

    //throws exception, but o1 node is created in Neo4j
    repo.save(o1);
  }

  public static void main(String[] args) {
    ApplicationContext appContext = new ClassPathXmlApplicationContext("context.xml");
    Test t = (Test) appContext.getBean("test");
    t.run();
  }
}

SDN并不真正支持批处理API通过线表示的“虚假”事务,因为它使用写后读的方式,但这是行不通的。

现在,我宁愿建议您使用嵌入式DB运行SDN或使用SDN编写服务器扩展并公开自定义REST端点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM