最新の安定バージョンについては、Spring Data Neo4j 8.1.1 を使用してください!

変換

規約ベースのマッピング

Neo4j コンバーターには、追加のマッピングメタデータが提供されない場合にオブジェクトをマッピングするためのいくつかの規則があります。規約は次のとおりです。

  • 短い Java クラス名は、次の方法でプライマリラベルにマップされます。クラス com.bigbank.SavingsAccount は、savingsAccount プライマリラベルにマップされます。

  • コンバーターは、登録されている Spring コンバーターを使用して、オブジェクトプロパティのノードフィールドおよび値へのデフォルトのマッピングをオーバーライドします。

  • オブジェクトのフィールドは、グラフ内のフィールドとの間の変換に使用されます。パブリック JavaBean プロパティは使用されません。

  • コンストラクター引数名がノードのトップレベルのプロパティ名と一致する非ゼロ引数のコンストラクターが 1 つある場合、そのコンストラクターが使用されます。それ以外の場合は、引数なしのコンストラクターが使用されます。引数がゼロではないコンストラクターが複数ある場合、例外がスローされます。

すぐに使える幅広い変換をサポートします。公式ドライバーマニュアルでサポートされている暗号型のリストを見つけてください: 型マッピング (英語) 。

ラッパー型のプリミティブ型も同様にサポートされます。

ドメインの種類 暗号の種類 ネイティブ型に直接マッピングします

java.lang.Boolean

Boolean

✔

boolean[]

ブール値のリスト

✔

java.lang.Long

整数

✔

long[]

整数のリスト

✔

java.lang.Double

フロート

✔

double[]

フロート一覧

✔

java.lang.String

String

✔

java.lang.String[]

文字列のリスト

✔

byte[]

ByteArray

✔

java.lang.Byte

長さ 1 の ByteArray

java.lang.Character

長さ 1 の文字列

char[]

長さ 1 の文字列のリスト

java.util.Date

ISO 8601 日付 (yyyy-MM-dd’T’HH:mm:ss.SSSZ) としてフォーマットされた文字列。Z:SDN はすべての java.util.Date インスタンスを UTC に保存することに注意してください。タイムゾーンが必要な場合は、それをサポートする型 (つまり ZoneDateTime) を使用するか、ゾーンを別のプロパティとして保存します。

java.lang.Float

String

float[]

文字列のリスト

java.lang.Integer

整数

int[]

整数のリスト

java.util.Locale

BCP 47 言語タグとしてフォーマットされた文字列

java.lang.Short

整数

short[]

整数のリスト

java.math.BigDecimal

String

java.math.BigInteger

String

java.time.LocalDate

日付

✔

java.time.OffsetTime

時間

✔

java.time.LocalTime

LocalTime

✔

java.time.ZonedDateTime

日時

✔

java.time.LocalDateTime

LocalDateTime

✔

java.time.OffsetDateTime

日時

java.time.Instant

日時

java.util.TimeZone

String

java.time.ZoneId

String

java.time.Period

持続時間

java.time.Duration

持続時間

org.neo4j.driver.types.IsoDuration

持続時間

✔

org.neo4j.driver.types.Point

ポイント

✔

org.springframework.data.neo4j.types.GeographicPoint2d

CRS 4326 のポイント

org.springframework.data.neo4j.types.GeographicPoint3d

CRS 4979 のポイント

org.springframework.data.neo4j.types.CartesianPoint2d

CRS 7203 のポイント

org.springframework.data.neo4j.types.CartesianPoint3d

CRS 9157 のポイント

org.springframework.data.geo.Point

CRS 4326 と緯度 / 経度に対応する x/y を持つポイント

org.springframework.data.domain.Vector

setNodeVectorProperty を通じて持続

Enum のインスタンス

String (列挙型の名前の値)

Enum[] のインスタンス

文字列のリスト (列挙型の名前の値)

java.net.URL

String

java.net.URI

String

java.util.UUID

String

ベクトル型

Spring Data には、ベクトル表現用の独自の型 org.springframework.data.domain.Vector があります。これは float または double 配列のラッパーとして使用できますが、Spring Data Neo4j は現在 double バリアントのみをサポートしています。ユーザーの観点からは、プロパティ定義で Vector インターフェースのみを定義し、double または float のいずれかを使用することが可能です。Neo4j は、double と float の両方のバリアントを 64 ビット Cypher FLOAT 値として保存します。これは、Cypher を通じて永続化された値、および Spring Data Neo4j がプロパティの永続化に使用する専用の setNodeVectorProperty 関数と一致しています。

Spring Data Neo4j では、エンティティ定義に存在できる Vector プロパティは 1 つだけです。
浮動小数点数の性質上、永続化された float 値は読み戻された値とは異なることに注意してください。

カスタム変換

特定の型の属性の場合

エンティティ内で独自の型を操作する場合、または @Query アノテーション付きメソッドのパラメーターとして独自の型を操作する場合は、カスタムコンバーター実装を定義して提供できます。まず、GenericConverter を実装し、コンバーターが処理する必要がある型を登録する必要があります。エンティティプロパティの型コンバーターの場合、型を Neo4j Java Driver Value との間で変換する必要があります。コンバーターがリポジトリ内のカスタムクエリメソッドでのみ動作することを想定している場合は、Value 型への一方向変換を提供するだけで十分です。

カスタムコンバーターの実装例
public class MyCustomTypeConverter implements GenericConverter {

	@Override
	public Set<ConvertiblePair> getConvertibleTypes() {
		Set<ConvertiblePair> convertiblePairs = new HashSet<>();
		convertiblePairs.add(new ConvertiblePair(MyCustomType.class, Value.class));
		convertiblePairs.add(new ConvertiblePair(Value.class, MyCustomType.class));
		return convertiblePairs;
	}

	@Override
	public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
		if (MyCustomType.class.isAssignableFrom(sourceType.getType())) {
			// convert to Neo4j Driver Value
			return convertToNeo4jValue(source);
		}
		else {
			// convert to MyCustomType
			return convertToMyCustomType(source);
		}
	}


}

SDN にコンバーターを認識させるには、コンバーターを Neo4jConversions に登録する必要があります。これを行うには、org.springframework.data.neo4j.core.convert.Neo4jConversions 型の @Bean を作成する必要があります。それ以外の場合、Neo4jConversions は内部のデフォルトコンバーターのみを使用してバックグラウンドで作成されます。

カスタムコンバーターの実装例
@Bean
public Neo4jConversions neo4jConversions() {
	Set<GenericConverter> additionalConverters = Collections.singleton(new MyCustomTypeConverter());
	return new Neo4jConversions(additionalConverters);
}

アプリケーションで複数のコンバーターが必要な場合は、Neo4jConversions コンストラクターに必要な数だけコンバーターを追加できます。

特定の属性のみ

一部の特定の属性のみの変換が必要な場合は、@ConvertWith が提供されます。これは、エンティティ (@Node) と関連プロパティ (@RelationshipProperties) の両方の属性に付けることができるアノテーションです。これは、converter 属性を介して Neo4jPersistentPropertyConverter を定義し、前者を構築するオプションの Neo4jPersistentPropertyConverterFactory を定義します。Neo4jPersistentPropertyConverter の実装により、特定の型のすべての特定の変換に対処できます。さらに、@ConvertWith は、Neo4jPersistentPropertyConverter を実装するアプリケーションコンテキストで Spring Bean を参照するための converterRef も提供します。新しいコンバーターを構築するよりも、参照されている Bean が優先されます。

ネイティブ型を使用しない Neo4j-OGM スキームとの下位互換性のために、メタアノテーション付きアノテーションとして @DateLong および @DateString を提供します。これらは、上記の概念に基づいて構築されたメタアノテーション付きのアノテーションです。

複合プロパティ

@CompositeProperty を使用すると、型 Map<String, Object> または Map<? extends Enum, Object> の属性を複合プロパティとして保存できます。マップ内のすべてのエントリは、プロパティを含むノードまたはリレーションシップにプロパティとして追加されます。構成済みの接頭辞を付けるか、プロパティの名前を接頭辞として付けます。この機能はすぐに使用できるマップに対してのみ提供されますが、Neo4jPersistentPropertyToMapConverter を、@CompositeProperty で使用するコンバーターとして構成することができます。Neo4jPersistentPropertyToMapConverter は、特定の型をマップに分解し、マップから再構成する方法を知る必要があります。