【问题标题】:Neo4j SDN internationalizationNeo4j SDN 国际化
【发布时间】:2017-05-16 14:17:26
【问题描述】:

我有以下 SDN 4 个实体:

Decision、Characteristic 和 Value:

@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。

能否请您展示一种使用当前架构实现此功能的正确方法?

例如,我是否应该在此处添加一个额外的节点(与值节点关联)来表示每种新语言的值/描述对,或者可以通过在现有值节点中引入新的语言特定属性来完成?

【问题讨论】:

    标签: neo4j spring-data-neo4j-4


    【解决方案1】:

    有很多选项可以通过 Spring Data Neo4j 添加多语言支持。

    https://graphaware.com/neo4j/2016/09/29/internationalization-with-spring-neo4j.html 中概述的一种方法(由我撰写)可以让您在实施解决方案方面领先一步。

    按照博客对您的 SDN 项目的设置和配置后,您可以使用 Cypher 为每个 Value 对象定义两个 MessageDefinitions,一个与 Value.value 匹配的代码,另一个与谁的代码匹配Value.description。走这条路,您实际上是在添加额外的节点(即:MessageDefinition 节点),这些节点与 Value 节点相关联,这些节点表示具有国际化和本地化消息的值和描述。换句话说,Value 的 value 和 description 属性用作对应 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);
    

    值得注意的是,这种方法的一个弱点是MessageDefinition 和Value 对象是通过匹配的节点属性关联的,而不是底层的 Neo4j 关系,因为它没有利用Neo4j 的核心优势(即:关系)。虽然这是需要注意的事情,但是否是实际问题取决于您的用例。如果它是一个交易破坏者,可以修改 CypherMessageSource 项目以更符合您的要求。

    查看您的示例代码,请注意您可能希望将 Value.value 属性的类型从 Object 更改为 String 以确保它是可靠的键。

    【讨论】:

    • 感谢您的详细解答!我需要时间来理解和测试它。我无法将Value.value 更改为String,因为根据我的业务逻辑它可以是任何类型。另外,我希望我的用户提供功能来动态设置不同的国际化和本地化消息的描述/值。 SDN是否可以通过MessageDefinitions动态操作来做到这一点?
    • 恐怕我不明白您所说的“SDN是否可以通过MessageDefinitions动态操作以做到这一点?”是什么意思?如果您问是否可以使用 SDN 创建映射到底层 MessageDefinitions 的域对象,然后将 MessageDefinition 作为应用程序 CRUD 的一部分进行操作,是的,这是完全可行的。
    • 谢谢埃里克。是的,你是对的。我在询问 SDN 创建映射到底层 MessageDefinition 的域对象的可能性。现在我不清楚如何处理动态属性。例如,我可以定义一个声明了 en_US 属性的域对象,但后者动态地将另一个属性添加到我的 MessageDefinition 节点中。假设 - fr_FR。如何处理SDN域实体对象的这个新属性,无需声明新字段并重新编译代码?
    • 即将在 SDN5 中提供地图的 @Properties 注释,这可能正是您想要的。同时,我会放弃映射到底层 MessageDefinition 的 SDN 域对象,转而使用 Cypher 来查询所需的属性。
    猜你喜欢
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2015-08-31
    • 2011-12-27
    • 2021-12-10
    相关资源
    最近更新 更多