使用 Spring Data Neo4j 检索现有节点时出现问题

Issues while retrieving existing nodes using Spring Data Neo4j

我创建了一个简单的 SDN 项目来从我的数据库中检索现有节点。在存储库中,我使用 @Query 注释定义了一个自定义查询,类似于

@Query("MATCH (EMP:EMPLOYEE) WHERE EMP.empName={0} return EMP")

public Employee findByName(String empName);

@RelationshipEntity(type = "HAS_ADDRESS")
class AddressRelationShip
{
 @GraphId
 Long id;
 @StartNode
 Employee employee = null;
 @EndNode
 Address address = null;

 public AddressRelationShip(Employee employee, Address address)
 {
  this.employee = employee;
  this.address = address;
 }

}

@NodeEntity
@TypeAlias("EMPLOYEE")
public class Employee
{

 @GraphId
 Long id;

 String empName = null;

 @RelatedTo(type = "HAS_ADDRESS", direction = Direction.OUTGOING)
 @Fetch
 Set<Address> addresses;

 public void addressEmplployee(Address address)
 {
  if (addresses == null)
  {
   addresses = new HashSet<Address>();
  }
  //AddressRelationShip addressRelationShip = new AddressRelationShip(this, address);
  addresses.add(address);
 }

 public Set<Address> getAddresses()
 {
  return addresses;
 }

 public void setAddresses(Set<Address> addresses)
 {
  this.addresses = addresses;
 }

 public Long getId()
 {
  return id;
 }

 public void setId(Long id)
 {
  this.id = id;
 }

 public String getEmpName()
 {
  return empName;
 }

 public void setEmpName(String empName)
 {
  this.empName = empName;
 }
}

使用此查询,在执行时我收到以下错误消息:

不存在主要 SDN 标签..(即以 _ 开头的标签)

我用谷歌搜索了这个问题并尝试使用以下查询:

匹配 (EMP:EMPLOYEE:_EMPLOYEE) WHERE EMP.EmployeeId={0} return EMP

此查询运行但未return任何响应。

这里有一件重要的事情是我没有使用 SDN 创建现有节点(我用谷歌搜索发现 SDN 添加了一些元数据,例如 _ 到 nodes/relationships)。

但是,如果我使用 SDN 创建了 (Employee)-[HAS_ADDRESS]->(ADDRESS) 模式数据,则以下查询工作正常:

MATCH (EMP:EMPLOYEE) WHERE EMP.empName={0} return EMP

在这种情况下,我发现了另一个问题,即当我在查询中只 returning Employee 时,它​​也会 returned 地址数据。 我能够从 Employee 实体对象获取地址。

对上述问题有什么指点吗?

PS - Neo4j 在独立服务器模式下 运行。

此致, 拉胡尔

我可以通过以下步骤解决上述问题:

  1. 不存在主要的 SDN 标签 ..(即以 _ 开头的标签) - 在 SDN 3.3.0 中,对于现有节点,SDN 需要一个额外的标签(在我的例子中, _EMPLOYEE),所以需要进行数据迁移。在SDN 4.0中,似乎不再需要这个了,但我还没有尝试过4.0。
  2. 当我只在查询中返回 Employee 时也返回地址数据 - 删除 Set addresses in Employee 上的 @Fetch 解决了这个问题,但是,地址 nodeIds 仍然被返回。

到 运行 SDN 3.x.x 与现有数据,需要进行以下数据迁移:

  1. 向节点添加额外的 NodeLabel(在原始标签之前加上 _),例如,向所有 Employee 节点添加 _Employee 标签。
  2. 将 __type__ 属性 添加到其值将是适当 domain/model 类 的完全限定名称的节点和关系,例如, 匹配(n:员工)设置n.__type__="org.neo4j.domain.Employee"

干杯,

拉胡尔