【问题标题】:Spring Data Neo4J @Index(unique = true) does not workingSpring Data Neo4J @Index(unique = true) 不起作用
【发布时间】:2019-02-18 11:57:43
【问题描述】:

我想将 User 节点中的 userName 属性设为唯一。 我使用了下面的代码,但它没有在 Neo4j 数据库中创建唯一约束。

@Property(name = "name")
@Index(unique = true)
private String usreName;

仅供参考,我使用的是 Neo4j 服务器版本:3.3.6(社区)和 Spring Boot 2。
但是如果我自己在 Neo4j 浏览器中创建一个约束,它就可以工作。

CREATE CONSTRAINT ON (user:User) ASSERT user.userName IS UNIQUE

有没有办法强制 Spring Data Neo4J 创建独特的属性,而不是我自己在数据库中创建它们?

【问题讨论】:

  • 我已经成功集成了 Liquigraph,它是一种使用 Neo4j Cypher 命令执行 .xml 更改日志的工具(您正在使用“CREATE CONSTRAINT ON (user:User) ASSERT user.userName IS UNIQUE” )。看看我下面的答案并投票吧!谢谢

标签: spring-boot neo4j spring-data-neo4j


【解决方案1】:

感谢@ThirstForKnowledg 的回答。但我还有 3 个其他问题:
1-我使用的是 Spring Boot 2,在我的类路径中看不到 Neo4jOperations 来导入它。

2- 我应该把它放在我的实体节点还是另一个 bean 中?
3- 运行我的应用程序两次或更多次后会怎样?我认为这会导致第二次或更多次异常。

【讨论】:

    【解决方案2】:

    您可以通过application.properties配置我们的自动索引管理器的工作模式

    spring.data.neo4j.auto-index=validate # or
    # spring.data.neo4j.auto-index=update
    # spring.data.neo4j.auto-index=assert
    

    默认模式是none。除此之外,@meistermeier 所说的也适用。

    此外,Neo4jOperations 在 SDN 4 中已被弃用,并已在 SDN 5 中删除。使用Session 代替“靠近”数据库的操作。

    【讨论】:

    • @meistermeier @MichaelSimons 不幸的是,在updateassert 模式下激活自动索引管理器对我来说既不能通过application.properties 也不能通过ogm.properties 工作。使用 Neo4j 3.4.7 我没有收到相关的警告/信息消息或异常,尽管有 @NodeEntity@Index(unique = true) 注释,但根本没有创建索引。似乎属性条目被忽略了。执行CALL db.indexes();CALL db.constraints(); 不会产生任何结果。
    【解决方案3】:

    原因

    在 Spring Data Neo4j 4 中,索引管理问题已从 完全映射框架。

    (来自Index Management in Spring Data Neo4j

    解决方案

    @Autowired
    private SessionFactory sessionFactory;
    
    @PostConstruct
    public void createIndexesAndConstraints() {
        Session session = sessionFactory.openSession();
        Result result = session.query("CREATE INDEX ON :User(userName)", Collections.EMPTY_MAP);
    }
    

    【讨论】:

    • @HadiMohammadi 对于您的第一个问题:Neo4jOperations 已被弃用并同时被删除。很抱歉给您带来的不便。请通过 Neo4j session 执行您的索引构建查询。它现在反映在更新的答案中。
    • @HadiMohammadi 关于第二个问题:您可以将代码 sn-p 放在任意类中,该类用 @Component 注释。在 Spring Boot 应用程序启动期间,扫描 bean 并在所有服务初始化后运行一次由 @PostConstruct 注释的方法。
    • @HadiMohammadi 对于您的第三个问题:在单独的问题中回答:StackOverflow: launching-a-create-index-on-when-the-index-already-exists-in-neo4j)
    【解决方案4】:

    如果您希望应用程序代码创建约束,您需要配置自动索引管理器。 您可以在文档中找到最合适的选项: https://docs.spring.io/spring-data/neo4j/docs/current/reference/html/#reference:indexing:creation

    只是关于这个主题的一个注释:想想像 Hibernate 的 DDL 支持这样的自动索引创建。它是开发时的帮手。您不应该在生产环境中使用assertupdate,而只能使用validate

    【讨论】:

      猜你喜欢
      • 2012-10-07
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      相关资源
      最近更新 更多