2017-05-16 105 views
2

我有以下SDN 4個實體:Neo4j的SDN國際

DecisionCharacteristicValue

@NodeEntity 
public class Value { 

    private final static String SET_FOR = "SET_FOR"; 
    private final static String SET_ON = "SET_ON"; 

    @Relationship(type = SET_FOR, direction = Relationship.OUTGOING) 
    private Decision decision; 

    @Relationship(type = SET_ON, direction = Relationship.OUTGOING) 
    private Characteristic characteristic; 

    @Index(unique = false) 
    private Object value; 

    private String description; 
... 

} 

我想補充的Value多語言支持,以便能夠提供任何語言的Value.valueValue.description

您能否請您展示一個適當的方式來實現這與當前架構?

我應該在那裏添加一個額外的節點(與價值節點相關),它將代表每個新語言的值/描述對,或者可以通過在現有價值節點內引入新的語言特定屬性來完成?

回答

5

有許多選項可以通過Spring Data Neo4j添加多語言支持。

https://graphaware.com/neo4j/2016/09/29/internationalization-with-spring-neo4j.html(以及我自己編寫)中概述的一種方法可能會讓您在實施解決方案方面領先一步。

以下後,博客的設置和您的SDN項目配置,爲每個Value的對象,你可以使用暗號定義兩個MessageDefinitions,一個與該Value.value匹配的代碼,另一個是誰的代碼相匹配的Value.description。沿着這條路線,您基本上會添加與Value節點關聯的額外節點(即:MessageDefinition節點),該節點使用國際化和本地化的消息來表示值和描述。換句話說,Value的值和描述屬性充當相應的MessageDefinition節點的關鍵字。

與您的項目配置和您的Neo4j期望定義MessageDefinitions,你可以使用下面的代碼在控制器或服務來獲取你的國際化和本地化值:

Value value = valueRepository.findOne(id); 

    Object arguments[] = new Object[] {}; 
    Locale locale = LocaleContextHolder.getLocale(); 

    String valueMessageKey = value.getValue(); 
    String i18Value = messageSource.getMessage(valueMessageKey, arguments, "defaultValue", locale); 

    String descriptionMessageKey = value.getDescription(); 
    String i18Description = messageSource.getMessage(descriptionMessageKey, arguments, "defaultDescription", locale); 

    System.out.println("i18Value: " + i18Value); 
    System.out.println("i18Description: " + i18Description); 

值得一提的是,這方面的一個弱點方法是,MessageDefinitionValue對象通過匹配的節點屬性而不是Neo4j關係相關,因爲它沒有利用Neo4j的核心優勢(即:關係),效率較低。雖然這是要注意的事情,但如果這是一個實際問題,則取決於您的使用情況。如果它是一個交易斷路器,可以修改CypherMessageSource項目以更貼近您的要求。

查看您的示例代碼,請注意,您可能希望將Value.value屬性的類型從Object更改爲String,以確保它是可靠的密鑰。

+0

感謝您的詳細解答!我需要一段時間才能理解和測試它。我無法將'Value.value'更改爲'String',因爲根據我的業務邏輯,它可以是任何類型。另外,我希望我的用戶能夠提供功能來動態地設置不同的國際化和本地化的消息來描述/價值。爲了做到這一點,SDN是否可以動態使用'MessageDefinitions'進行操作? – alexanoid

+0

恐怕我不明白你的意思是「SDN可以動態操作MessageDefinitions來完成它嗎?」如果您問是否可以使用SDN創建一個映射到底層MessageDefinition的域對象,然後將MessageDefinition作爲應用程序CRUD的一部分操作,那是完全可行的。 –

+0

謝謝埃裏克。是的,你是對的。我在詢問SDN創建映射到底層MessageDefinition的域對象的可能性。現在我不清楚如何處理動態屬性..例如,我可以定義一個聲明en_US屬性的域對象,但後者動態地添加到我的MessageDefinition節點的另一個屬性。讓我們說 - fr_FR。如何處理SDN域實體對象中的這個新屬性,而無需聲明新字段並重新編譯代碼? – alexanoid