轉換

基於約定的對映

當沒有提供額外的對映元資料時,Neo4j 轉換器有一些用於對映物件的約定。這些約定是

  • Java 類的短名稱以下列方式對映到主標籤:類 com.bigbank.SavingsAccount 對映到 savingsAccount 主標籤。

  • 轉換器使用任何已註冊的 Spring 轉換器來覆蓋物件屬性到節點欄位和值的預設對映。

  • 物件的欄位用於圖中的欄位之間的轉換。不使用公共 JavaBean 屬性。

  • 如果只有一個非零引數建構函式,並且其建構函式引數名稱與節點的頂級屬性名稱匹配,則使用該建構函式。否則,使用零引數建構函式。如果有多個非零引數建構函式,則會丟擲異常。

我們開箱即用地支援廣泛的轉換。請參閱官方驅動程式手冊中支援的 Cypher 型別列表:型別對映

原始型別或包裝型別同樣受支援。

領域型別 Cypher 型別 直接對映到原生型別

java.lang.Boolean

布林值

boolean[]

布林值列表

java.lang.Long

整數

long[]

整數列表

java.lang.Double

浮點數

double[]

浮點數列表

java.lang.String

字串

java.lang.String[]

字串列表

byte[]

位元組陣列

java.lang.Byte

長度為 1 的位元組陣列

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

字串

float[]

字串列表

java.lang.Integer

整數

int[]

整數列表

java.util.Locale

格式為 BCP 47 語言標籤的字串

java.lang.Short

整數

short[]

整數列表

java.math.BigDecimal

字串

java.math.BigInteger

字串

java.time.LocalDate

日期

java.time.OffsetTime

時間

java.time.LocalTime

本地時間

java.time.ZonedDateTime

日期時間

java.time.LocalDateTime

本地日期時間

java.time.OffsetDateTime

日期時間

java.time.Instant

日期時間

java.util.TimeZone

字串

java.time.ZoneId

字串

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 持久化

列舉例項

字串(列舉的名稱值)

列舉陣列例項

字串列表(列舉的名稱值)

java.net.URL

字串

java.net.URI

字串

java.util.UUID

字串

向量型別

Spring Data 有自己的向量表示型別 org.springframework.data.domain.Vector。雖然這可以用作 floatdouble 陣列的包裝器,但 Spring Data Neo4j 目前只支援 double 變體。從使用者角度來看,可以在屬性定義上只定義 Vector 介面,並使用 doublefloat。Neo4j 會將 doublefloat 變體都儲存為 64 位 Cypher FLOAT 值,這與透過 Cypher 和 Spring Data Neo4j 用於持久化屬性的專用 setNodeVectorProperty 函式持久化的值一致。

Spring Data Neo4j 實體定義中只允許存在一個 Vector 屬性。
請注意,由於浮點數的特性,持久化的 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 還提供了 converterRef,用於引用應用程式上下文中實現 Neo4jPersistentPropertyConverter 的任何 Spring bean。引用 bean 將優先於構造新的轉換器。

我們提供了 @DateLong@DateString 作為元註解,以實現與不使用原生型別的 Neo4j-OGM 方案的向後相容性。這些是基於上述概念的元註解。

複合屬性

使用 @CompositeProperty,型別為 Map<String, Object>Map<? extends Enum, Object> 的屬性可以儲存為複合屬性。地圖中的所有條目都將作為屬性新增到包含該屬性的節點或關係中。可以配置字首,或者以屬性名稱作為字首。雖然我們只針對地圖開箱即用地提供此功能,但您可以 Neo4jPersistentPropertyToMapConverter 並將其配置為 @CompositeProperty 上使用的轉換器。Neo4jPersistentPropertyToMapConverter 需要知道給定型別如何分解為地圖以及如何從地圖中組合回來。

© . This site is unofficial and not affiliated with VMware.