我已经开始使用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查询吗?
答案 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);