麻烦地阅读neo4j rest api查询结果

时间:2014-04-30 17:56:14

标签: spring neo4j spring-data-neo4j

我真的希望没有被问及我的搜索技能缺乏。我目前正在学习Spring数据如何通过其余的api(spring-data-neo4j-rest)与neo4j独立服务器进行交互,并在迭代查询结果时遇到了一个有趣的问题。

我首先创建了Instant Spring Tool Suite一书中的neo4j项目(使用嵌入式数据库),验证它是否有效,将项目升级到Spring的最新版本,验证是否有效,然后将其指向独立服务器进行必要的更改。

我能够在我的JUnit测试用例中创建节点,但是当针对带有带注释的查询的方法运行测试用例时,它似乎无法正常工作。我已经尝试过寻找可能遇到这个问题的例子和其他人,并且相信我的相对缺乏经验是这个问题的主要来源。

以下是查询代码:     @Query(" MATCH(x {name:{0}})< - [role:MEMBER_OF] - (员工)"     +"返回distinct employee.firstName +' ' + employee.lastName作为名称,"     +" role.title as title")     可迭代> 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"));

}

通过休息客户端运行查询时的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"
-
-
}

当迭代Map结果时,它似乎只是拉出第一个json响应,导致测试单元失败,因为它需要一个名字&#34; Jane Doe。&#34;我添加了打印件以查看它在角色1和2以及每种情况下的数据中提取的内容&#34; John Doe&#34;和&#34;软件工程师&#34;被印了。我更改了测试以在角色2中查找John Doe记录,并添加了第三次迭代,期望它失败,因为结果集应该只包含两个记录,但这也会返回John Doe记录。

我为长篇解释道歉,但有人能指出我正确的方向来阅读查询的回复吗?

1 个答案:

答案 0 :(得分: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:REST上的SDN不是优化的解决方案,您可能要么将其更改为服务器扩展,要么继续使用嵌入式数据库。

请参阅此示例:http://inserpio.wordpress.com/2014/04/30/extending-the-neo4j-server-with-spring-data-neo4j/