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

时间:2019-12-18 10:31:00

标签: 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<>();
}

我遇到的问题是,由于不受支持的Type,Neo4J OGM抱怨它无法保留Map<CustomEnum, Instant>

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

我找到了来自MapCompositeConverterLink to Github的异常源。

如果我的分析是正确的,则核心问题在于OGM仅允许使用AbstractConfigurableDriverLink to Github

中定义的默认Cypher类型。

这与文档here中说明的行为不同,该文档说明应该支持许多本机Java类型(包括临时类型Instant, LocalDate, Period)。

我对正确方向的指针感到非常高兴。

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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;

但是,广泛使用Converters有点抵消了Neo4j所带来的Traverse-The-Graph优势,因为现在您需要使用索引。 这样就可以了,但是也许您需要考虑一下架构以使用更多的节点而不是嵌入式compley属性。

希望这会有所帮助。