【问题标题】:neo4j spring use existing dataneo4j spring 使用现有数据
【发布时间】:2014-01-21 08:55:24
【问题描述】:

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

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

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

@Component
public interface HrRepository extends GraphRepository<Hr> {

    Hr findByName(String name);

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

命名查询 GetAllHrByLabels 运行良好。

是否有在现有数据上使用标准方法(findAll() 、 findByName())而不重新定义 Cypher 查询的现有方法?

【问题讨论】:

    标签: spring neo4j spring-data-neo4j


    【解决方案1】:

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

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

    考虑一个名为Person@NodeEntity,它继承自AbstractNodeEntity(为简洁起见,删除了导入和无关代码):

    抽象节点实体:

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

    人:

    @NodeEntity
    @TypeAlias("Person")    // <== This line added for SDN 3.0
    public class Person extends AbstractNodeEntity {
      public String name;
    }
    

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

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

    MATCH (n {__type__:'Person'}) SET n:`_Person`:`AbstractNodeEntity`;
    

    只需清洗/冲洗/重复您拥有的其他 @NodeEntity 类型。

    还有一个名为SDN_LABEL_STRATEGY 的 Neo4j 标签被创建,但它没有应用于任何节点,至少在我的数据中是这样。 SDN 3 肯定是自动创建的,因为我没有手动创建。

    希望这会有所帮助...

    -克里斯

    【讨论】:

      【解决方案2】:

      在 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);
      

      【讨论】:

      • 谢谢迈克尔,但似乎 postEntityCreation() 在 SDN 3 中已被弃用,并且 template.query(String) 不存在。我有什么问题吗?
      • 看来 SDN 3 仍然在 Neo4j 中继续使用遗留索引系统(基于 lucene)。您知道这是否计划被替换/更新以使用 Neo4J 2.0 索引系统(或者可能是标签)?
      猜你喜欢
      • 2012-11-27
      • 2015-09-07
      • 2012-09-20
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多