簡體   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