2014-04-30 62 views
0

我真的希望這沒有被問及我的搜索技能缺乏。目前我正在學習Spring數據如何通過其餘的api(spring-data-neo4j-rest)與neo4j獨立服務器進行交互,並在迭代查詢結果時遇到了一個有趣的問題。無法閱讀neo4j休息api查詢結果interently

我通過創建Instant Spring Tool Suite一書中的neo4j項目(使用嵌入式數據庫)開始,驗證它是否有效,將項目升級到最新版本的Spring,驗證該項目是否有效,然後指向它一個獨立的服務器進行必要的更改。

我能夠在我的JUnit測試用例中創建節點,但是當針對具有註釋查詢的方法運行測試用例時,它似乎無法正常工作。我試着尋找可能遇到問題的例子和其他人,並且相信這是我相對缺乏經驗是問題的主要來源。

下面是該查詢的代碼: @Query( 「MATCH(X {名稱:{0}})< - [作用:MEMBER_OF] - (僱員)」 +「返回不同employee.firstName + '' + employee.lastName as name,「 +」role.title as title「) Iterable> findEmployeesAndRolesByProjectName(String prjName);

下面是測試情況:

@Transactional 
public void shouldReturnEmployeesAndRolesByProject() { 
    Project projectX = template.save(new Project("Project X")); 
    Project projectY = template.save(new Project("Project Y")); 

    Employee johnDoe = template.save(new Employee("John", "Doe")); 
    johnDoe.assignedTo(projectX, "Software Engineer"); 
    johnDoe.assignedTo(projectY, "Business Analyst"); 
    template.save(johnDoe); 
    Employee janeDoe = template.save(new Employee("Jane", "Doe")); 
    janeDoe.assignedTo(projectX, "Project Manager"); 
    template.save(janeDoe); 

    Iterable<Map<String, String>> projectRoles = projectRepository 
      .findEmployeesAndRolesByProjectName("Project X"); 

    Map<String, String> role1 = projectRoles.iterator().next(); 

    System.out.print(role1.get("name") + ' ' + role1.get("title") + '\n'); 
    assertEquals("John Doe", role1.get("name")); 
    assertEquals("Software Engineer", role1.get("title")); 

    Map<String, String> role2 = projectRoles.iterator().next(); 
    System.out.print(role2.get("name") + ' ' + role2.get("title") + '\n'); 
    assertEquals("Jane Doe", role2.get("name")); 
    assertEquals("Project Manager", role2.get("title")); 

    Map<String, String> role3 = projectRoles.iterator().next(); 
    System.out.print(role3.get("name") + ' ' + role3.get("title") + '\n'); 
    assertEquals("John Doe", role3.get("name")); 
    assertEquals("Software Engineer", role3.get("title")); 

} 

通過REST客戶端,導致以下運行查詢時,JSON響應:

{ 
columns: [2] 
0: "name" 
1: "title" 
- 
data: [2] 
0: [2] 
0: "John Doe" 
1: "Software Engineer" 
- 
1: [2] 
0: "Jane Doe" 
1: "Project Manager" 
- 
- 
} 

當通過地圖迭代結果似乎只拉第一個json響應,導致測試單元失敗,因爲它期望名爲「Jane Doe」。我添加了這些印刷品以查看它在角色1和2中的數據,並在每種情況下都印刷了「John Doe」和「Software Engineer」。我將測試更改爲在角色2中查找John Doe記錄,並添加了第三次迭代,期望它失敗,因爲結果集應該只包含兩條​​記錄,但也會返回John Doe記錄。

對於長時間的解釋我表示歉意,但是任何人都可以指向正確的方向來閱讀查詢中的響應嗎?

回答

0

這是不正確的。您正在重新創建始終從頭開始的迭代器。

Map<String, String> role1 = projectRoles.iterator().next(); 

做這樣的:

Iterator<Map<String, String>> it = projectRoles.iterator() 
Map<String, String> role1 = it.next(); 
Map<String, String> role2 = it.next(); 
assertFalse(it.hasNext()); 

P.S:SDN通過REST不是一個優化的解決方案,你可能要麼需要將其更改爲服務器擴展或留在嵌入式數據庫。

請參閱此示例:http://inserpio.wordpress.com/2014/04/30/extending-the-neo4j-server-with-spring-data-neo4j/