2017-05-16 13 views
2

I持って、次の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.valueおよびValue.description

これを現在のスキーマで実装する適切な方法を教えてください。

たとえば、新しい言語ごとに値/説明のペアを表す余分なノードを追加するか、既存の値ノード内に新しい言語固有のプロパティを導入することによって行うことができますか?

答えて

5

Spring Data Neo4jによる多言語サポートの追加には、多くのオプションがあります。

https://graphaware.com/neo4j/2016/09/29/internationalization-with-spring-neo4j.htmlで概説されている1つのアプローチ(と私の作者)は、ソリューションの実装の先頭に立つことができます。

は、以下の後のブログの設定およびあなたのSDNプロジェクトの構成は、あなたのValueオブジェクトのそれぞれについて、あなたはValue.valueに一致するコードを持つ2つのMessageDefinitions、1を定義するためのCypherを使用することができ、別のコードが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''にマップするドメインオブジェクトを作成し、アプリケーションCRUDの一部として '' MessageDefinition''を操作できるかどうかを尋ねるなら、それは完全に実行可能です。 –

+0

ありがとうエリック。はい。それで合っています。私はSDNを使って基礎となるMessageDefinitionにマップするドメインオブジェクトを作成する可能性について尋ねています。今は動的なプロパティを扱う方法がわかりません。たとえば、宣言されたen_USプロパティでドメインオブジェクトを定義できますが、後者は動的にMessageDefinitionノードに別のプロパティを追加します。どのように新しいフィールドを宣言し、コードを再コンパイルする必要なく、SDNドメインエンティティオブジェクトでこの新しいプロパティを処理するには? – alexanoid