neo4j spring使用现有数据

时间:2014-01-03 16:08:11

标签: spring neo4j spring-data-neo4j

我已经开始使用SDN 3.0.0 M1和Neo4j 2.0(通过休息界面),我想使用现有的graph.db和现有数据。

通过hrRepository.save(myObject);找到通过SDN创建的节点我没有问题,但我无法通过hrRepository.findAll();或任何其他方法获取任何现有节点(不是通过SDN创建),尽管我手动在此现有节点中添加了属性__type__

我使用一个非常简单的存储库来测试:

@Component
public interface HrRepository extends GraphRepository<Hr> {

    Hr findByName(String name);

    @Query("match (hr:hr) return hr")
    EndResult <Hr> GetAllHrByLabels();
}

命名查询GetAllHrByLabels工作正常。

现有的方法是在现有数据上使用标准方法(findAll(),findByName())而无需重新定义Cypher查询吗?

2 个答案:

答案 0 :(得分:2)

从SDN 2.x升级到3.0时,我最近遇到了同样的问题。我首先按照本文中的步骤进行操作:http://maxdemarzi.com/2013/06/26/neo4j-2-0-is-coming/在现有数据上创建和启用Neo4j标签。

但是,从那里开始,我必须为SDN 3工作。正如您所遇到的,要做到这一点,您需要正确设置元数据。以下是如何做到这一点:

考虑一个名为@NodeEntity的{​​{1}},它继承自Person(为简洁而删除了导入和无关代码):

AbstractNodeEntity:

AbstractNodeEntity

人:

@NodeEntity
public abstract class AbstractNodeEntity {
  @GraphId private Long id;
}

如您所知,在SDN 2.x中,会自动创建一个@NodeEntity @TypeAlias("Person") // <== This line added for SDN 3.0 public class Person extends AbstractNodeEntity { public String name; } 属性,该属性存储SDN用于在从Neo4j读取节点实体时实例化的类名。这仍然是正确的,尽管在SDN 3.0中它现在使用__type__注释指定,​​如上例所示。 SDN 3.0还以Neo4j标签的形式添加了新的元数据,表示类层次结构,其中节点的类前面带有下划线(@TypeAlias)。

对于现有数据,您可以在Cypher中添加这些标签(我刚刚在Neo4j 2.0.1中使用了新的基于Web的Browser utilty),如下所示:

_

只需清洗/冲洗/重复其他MATCH (n {__type__:'Person'}) SET n:`_Person`:`AbstractNodeEntity`; 类型。

还有一个名为@NodeEntity的Neo4j标签,但它不适用于任何节点,至少在我的数据中是这样。 SDN 3必须自动创建它,因为我没有手动创建它。

希望这会有所帮助......

-Chris

答案 1 :(得分:0)

在REST上使用SDN可能不是性能最好的想法。就是你知道的。

未使用SDN创建的数据将没有必要的元信息。

您必须手动迭代节点并使用

template.postEntityCreation(Node,Class);

在每个上面添加类型信息。其中class是您的SDN注释实体类。

类似的东西:

for (Node n : template.query("match(n) where n.type = 'Hr' return n").to(Node.class)) 
  template.postEntityCreation(n,Hr.class);