java - Neo4j OGM @Properties 支持哪些条目类型?

标签 java spring-boot neo4j cypher spring-data-neo4j

我尝试使用 Spring Data Neo4j (SDN) 将以下实体持久保存到 Neo4J 数据库中。该实体有一个属性 java.util.Map<CustomEnum,Instant> .

检查以下示例代码:

public enum CustomEnum {
  TREE, LEAVE, FLOWER;
}
@NodeEntity
public class ExampleEntity {

  @Id
  @GeneratedValue
  private Long id;

  // omitted simple properties of type String

  @Properties(allowCast = true)
  Map<CustomEnum,Instant> myMapProperty = new HashMap<>();
}

我遇到的问题是,Neo4J OGM 提示它无法保留 Map<CustomEnum, Instant>因为类型不受支持。

org.neo4j.ogm.exception.core.MappingException:

我发现异常的来源来自 MapCompositeConverter : Link to Github .

如果我的分析是正确的,那么核心问题在于 OGM 只允许 AbstractConfigurableDriver 中定义的默认 Cypher 类型。 : Link to Github

这将是一种不同的行为,如文档 here 中所述。 ,这解释了应该支持许多 native Java 类型(包括时间类型 Instant, LocalDate, Period )。

如果有一个指向正确方向的指针,我会非常高兴。

预先感谢您的帮助。

最佳答案

Spring-Data-Neo4j 支持 String、Integer、Long 等基本类型。 还支持一些更复杂的类型,例如 Instant 和 Date,但这只是因为 Spring-Data-Neo4j 使用 OGM,它附带一组 AttributeConverters,可以将 Instant 和 Date 隐式转换为 String。 您可以定义自己的转换器并将它们放在 @Property 属性上以使用此转换器。

例如,您可以按如下方式构建 FooToStringConverter:

public class FooToStringConverter implements AttributConverter<Foo, String>{
  String convertToDatabaseColumn(Foo foo){
    return foo.toString();
  }

  Foo convertToEntityAttribute(String fooString){
    return Foo.fromString();
  }

}

然后将您的实体注释为

@Property
@Converter(converter=FooToStringConverter.class)
private Foo foo;

然而,转换器的广泛使用有点破坏了 Neo4j 所获得的遍历图表的优势,因为现在您需要使用索引。 它会以这种方式工作,但也许您需要过度考虑架构以使用更多节点而不是嵌入式完整属性。

希望这有帮助。

关于java - Neo4j OGM @Properties 支持哪些条目类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59390060/

相关文章:

java - 在 Spring Boot 中排除 Hibernate 不起作用

java - 如何建立与DVR的连接并解码数据?

java - rt.jar 中的工厂设计模式实现

java - 使用路径变量进行 GET 映射的自定义验证

mysql - Javers - 异步提交 - Spring boot - Hibernate

Neo4j 导入工具成功但结果未显示

java - Neo4j 非托管扩展和 GuardTimeoutException

java - 将字符串拆分为字符串数组

Angular 应用程序显示 cors 问题并且未重定向到 azure 广告登录页面

java - 使用现有数据集执行 Neo4j Cypher 查询(通过 Java)