【问题标题】:Create Neo4j relation in spring data with existing node使用现有节点在 spring 数据中创建 Neo4j 关系
【发布时间】: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]-&gt;manager?文档似乎暗示 STARTbeing 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


【解决方案1】:

请给出员工的定义!

你也可以使用template.createRelationshipBetween(nodeOrEntity,nodeOrEntity2,type)

对于您的示例,这应该有效:

公共接口 EmployeeRepository 扩展了 GraphRepository {

@Query("MATCH (employee:Employee), (manager:Employee) 
       WHERE id(employee) = {0} AND manager.name = {1}
       CREATE employee-[:REPORTS_TO]->manager")
void addNewEmployee(Employee employee, String managerName);
}

也许更好地使用,员工作为员工的数据容器/地图,或者直接传入名称:

@Query("MATCH (employee:Employee), (manager:Employee) 
       WHERE employee.name = {0}.name AND manager.name = {1}
       CREATE employee-[:REPORTS_TO]->manager")
void addNewEmployee(Employee employee, String managerName);
}

【讨论】:

  • 谢谢迈克尔。我已经尝试了您提供的第一个查询。但它给了我错误“嵌套异常是 org.neo4j.cypher.CypherTypeException:此处应为 propertycontainer 或数字,但得到:Employee{id=null, name=Developer2, department=Development}”。这似乎是 Employee 类中的 id 存在一些类型转换问题。
  • 我还更新了问题中的 Employee 类定义。
  • 对于第二个查询“MATCH (employee:Employee), (manager:Employee) WHERE employee.name = {0}.name AND manager.name = {1} CREATE employee-[:REPORTS_TO ]->经理。”错误为“类型不匹配:预期地图但为 Employee{id=null, name=Developer3, department=Development}”
猜你喜欢
  • 1970-01-01
  • 2016-05-01
  • 2018-11-23
  • 2018-01-26
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多