【问题标题】:Issues while retrieving existing nodes using Spring Data Neo4j使用 Spring Data Neo4j 检索现有节点时出现问题
【发布时间】:2015-05-15 07:43:26
【问题描述】:

我创建了一个简单的 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 标签 ..(即以 _ 开头的标签)

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

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

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

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

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

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

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

对上述问题有什么建议吗?

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

问候, 拉胡尔

【问题讨论】:

  • 我现在面临另一个人际关系问题。我的查询返回子句有一个节点,关系,另一个节点。我收到以下错误:org.neo4j.graphdb.NotFoundException:没有这样的属性,'type'。看来我需要以 relationshiptype 格式添加其他关系类型。但是我找不到对现有数据执行此操作的方法。谁能建议如何向现有关系添加新的关系类型?

标签: neo4j cypher spring-data-neo4j


【解决方案1】:

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

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

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

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

干杯,

拉胡尔

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    相关资源
    最近更新 更多