使用Spring Data Neo4j

时间:2015-05-15 07:43:26

标签: neo4j cypher spring-data-neo4j

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

@Query(“MATCH(EMP:EMPLOYEE)WHERE EMP.empName = {0}返回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标签..(即以_开头的那个)

我在Google上搜索了该问题并尝试使用以下查询:

MATCH(EMP:EMPLOYEE:_EMPLOYEE)WHERE EMP.EmployeeId = {0}返回EMP

此查询会运行,但不会返回任何响应。

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

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

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

在这种情况下,我发现另一个问题是它返回了地址数据,而我只是在查询中返回Employee。 我能够从Employee实体对象中获取地址。

关于上述问题的任何指示?

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

此致 拉胡

1 个答案:

答案 0 :(得分:0)

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

  1. 不存在主SDN标签..(即一个以_开头) - 在SDN 3.3.0中,对于现有节点,SDN需要额外的标签(在我的情况下,_EMPLOYEE),所以a数据迁移是必需的。在SDN 4.0中,似乎不再需要这个了,但我还没有尝试过4.0。
  2. 同时返回地址数据,而我只是在查询中返回Employee - 在Employee中删除@Fetch on Set地址解决了这个问题,但仍然返回地址nodeIds。
  3. 要使用现有数据运行SDN 3.x.x,需要进行以下数据迁移:

    1. 向节点添加额外的NodeLabel(在带有_的原始标签之前),例如,将_Employee标签添加到所有Employee节点。
    2. 将__type__属性添加到节点和关系,其值将是相应域/模型类的完全限定名称,例如, match(n:Employee)set n .__ type __ =“org.neo4j.domain.Employee”
    3. 干杯,

      的Rahul