【发布时间】:2015-09-07 11:17:53
【问题描述】:
我正在尝试在 Neo4j 中创建节点之间的关系。我正在使用 Neo4J(2.1.8 Community) 和 spring-data-neo4j(3.3.0.RELEASE)。
我正在尝试创建以下关系。
创建一个新的员工(节点),它将向数据库中的经理(节点)报告(空关系)(按名称搜索)。我使用了以下查询。
public interface EmployeeRepository extends GraphRepository<Employee> {
@Query("START employee=node:({0}), manager=node:Employee(name={1}) CREATE employee-[:REPORTS_TO]->manager")
void addNewEmployee(Employee employee, String managerName);}
我收到以下错误。
Caused by: org.springframework.dao.InvalidDataAccessResourceUsageException: Error executing statement START employee=node:({0}), manager=node:Employee(name={1}) CREATE employee-[:REPORTS_TO]->manager; nested exception is Invalid input '(': expected whitespace or an identifier (line 1, column 21)
"START employee=node:({0}), manager=node:Employee(name={1}) CREATE employee-[:REPORTS_TO]->manager"
^
谁能告诉我这个查询有什么问题?此外,如果这不是使用 GraphRepository 创建关系的正确方法,那么我还可以使用什么来完成相同的操作。
提前致谢。
注意:我已经使用this 学习了 Spring Data for Neo4j 中的查询。他们在哪里显示了基本查询。
更新:员工类
@NodeEntity
public class Employee {
@GraphId
private Long id;
private String name;
private String department;
@RelatedTo(type = "REPORTS_TO")
private Employee reportsTo;
@RelatedTo(type = "REPORTS_TO", direction = Direction.INCOMING)
Set<Employee> directReport;
public Employee() {
}
public Employee(String name, String department) {
this.name = name;
this.department = department;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public Employee getReportsTo() {
return reportsTo;
}
public void setReportsTo(Employee reportsTo) {
this.reportsTo = reportsTo;
}
public Set<Employee> getDirectReport() {
return directReport;
}
public void setDirectReport(Set<Employee> directReport) {
this.directReport = directReport;
}
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public boolean equals(Object obj) {
return super.equals(obj);
}
@Override
public String toString() {
return "Employee{" + "id=" + id + ", name=" + name + ", department=" + department + '}';
}
}
【问题讨论】:
-
对于初学者来说,node 函数和它的参数之间不应该有冒号。试试
employee=node({0}) -
我已经尝试过了,但现在它给出了新的错误。原因:org.springframework.dao.InvalidDataAccessResourceUsageException: Error execution statement START employee=node({0}), manager=node:Employee(name={1}) CREATE employee-[:REPORTS_TO]->manager;嵌套异常是 org.neo4j.cypher.MissingIndexException:索引
Employee不存在 -
即使对于简单的查询 START employee=node:Employee(name={0}) RETURN employee 它也给出了同样的异常。
-
您是否尝试过使用
MATCH代替名称,如START employee=node({0}) MATCH (manager:Employee) WHERE manager.name = {1} CREATE employee-[:REPORTS_TO]->manager?文档似乎暗示START是 being made obsolete anyway -
感谢丹的支持。我也试过了,但仍然有错误。但这一次不同。错误执行语句 START employee=node({0}) MATCH (manager:Employee) WHERE manager.name = {1} CREATE employee-[:REPORTS_TO]->manager;嵌套异常是 org.neo4j.cypher.CypherTypeException: Expected a propertycontainer or number here, but got: Employee{id=null, name=Developer2, department=Development}
标签: java neo4j spring-data-neo4j