轉換
基於約定的對映
當沒有提供額外的對映元資料時,Neo4j 轉換器有一些用於對映物件的約定。這些約定是
-
Java 類的短名稱以下列方式對映到主標籤:類
com.bigbank.SavingsAccount對映到savingsAccount主標籤。 -
轉換器使用任何已註冊的 Spring 轉換器來覆蓋物件屬性到節點欄位和值的預設對映。
-
物件的欄位用於圖中的欄位之間的轉換。不使用公共
JavaBean屬性。 -
如果只有一個非零引數建構函式,並且其建構函式引數名稱與節點的頂級屬性名稱匹配,則使用該建構函式。否則,使用零引數建構函式。如果有多個非零引數建構函式,則會丟擲異常。
我們開箱即用地支援廣泛的轉換。請參閱官方驅動程式手冊中支援的 Cypher 型別列表:型別對映。
原始型別或包裝型別同樣受支援。
| 領域型別 | Cypher 型別 | 直接對映到原生型別 |
|---|---|---|
|
布林值 |
✔ |
|
布林值列表 |
✔ |
|
整數 |
✔ |
|
整數列表 |
✔ |
|
浮點數 |
✔ |
|
浮點數列表 |
✔ |
|
字串 |
✔ |
|
字串列表 |
✔ |
|
位元組陣列 |
✔ |
|
長度為 1 的位元組陣列 |
|
|
長度為 1 的字串 |
|
|
長度為 1 的字串列表 |
|
|
格式為 ISO 8601 日期 ( |
|
|
字串 |
|
|
字串列表 |
|
|
整數 |
|
|
整數列表 |
|
|
格式為 BCP 47 語言標籤的字串 |
|
|
整數 |
|
|
整數列表 |
|
|
字串 |
|
|
字串 |
|
|
日期 |
✔ |
|
時間 |
✔ |
|
本地時間 |
✔ |
|
日期時間 |
✔ |
|
本地日期時間 |
✔ |
|
日期時間 |
|
|
日期時間 |
|
|
字串 |
|
|
字串 |
|
|
持續時間 |
|
|
持續時間 |
|
|
持續時間 |
✔ |
|
點 |
✔ |
|
CRS 4326 點 |
|
|
CRS 4979 點 |
|
|
CRS 7203 點 |
|
|
CRS 9157 點 |
|
|
CRS 4326 點,x/y 對應於緯度/經度 |
|
|
透過 |
|
列舉例項 |
字串(列舉的名稱值) |
|
列舉陣列例項 |
字串列表(列舉的名稱值) |
|
|
字串 |
|
|
字串 |
|
|
字串 |
向量型別
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 屬性。 |
請注意,由於浮點數的特性,持久化的 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 需要知道給定型別如何分解為地圖以及如何從地圖中組合回來。