我真的希望没有被问及我的搜索技能缺乏。我目前正在学习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记录。
我为长篇解释道歉,但有人能指出我正确的方向来阅读查询的回复吗?
答案 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/