使用 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 在独立服务器模式下 运行。
此致,
拉胡尔
我可以通过以下步骤解决上述问题:
- 不存在主要的 SDN 标签 ..(即以 _ 开头的标签) - 在 SDN 3.3.0 中,对于现有节点,SDN 需要一个额外的标签(在我的例子中, _EMPLOYEE),所以需要进行数据迁移。在SDN 4.0中,似乎不再需要这个了,但我还没有尝试过4.0。
- 当我只在查询中返回 Employee 时也返回地址数据 - 删除 Set addresses in Employee 上的 @Fetch 解决了这个问题,但是,地址 nodeIds 仍然被返回。
到 运行 SDN 3.x.x 与现有数据,需要进行以下数据迁移:
- 向节点添加额外的 NodeLabel(在原始标签之前加上 _),例如,向所有 Employee 节点添加 _Employee 标签。
- 将 __type__ 属性 添加到其值将是适当 domain/model 类 的完全限定名称的节点和关系,例如,
匹配(n:员工)设置n.__type__="org.neo4j.domain.Employee"
干杯,
拉胡尔
我创建了一个简单的 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 在独立服务器模式下 运行。
此致, 拉胡尔
我可以通过以下步骤解决上述问题:
- 不存在主要的 SDN 标签 ..(即以 _ 开头的标签) - 在 SDN 3.3.0 中,对于现有节点,SDN 需要一个额外的标签(在我的例子中, _EMPLOYEE),所以需要进行数据迁移。在SDN 4.0中,似乎不再需要这个了,但我还没有尝试过4.0。
- 当我只在查询中返回 Employee 时也返回地址数据 - 删除 Set addresses in Employee 上的 @Fetch 解决了这个问题,但是,地址 nodeIds 仍然被返回。
到 运行 SDN 3.x.x 与现有数据,需要进行以下数据迁移:
- 向节点添加额外的 NodeLabel(在原始标签之前加上 _),例如,向所有 Employee 节点添加 _Employee 标签。
- 将 __type__ 属性 添加到其值将是适当 domain/model 类 的完全限定名称的节点和关系,例如, 匹配(n:员工)设置n.__type__="org.neo4j.domain.Employee"
干杯,
拉胡尔