【发布时间】:2019-02-24 00:15:52
【问题描述】:
我正在编写一个应用程序来捕获其他应用程序的配置属性。 Config 是我的主要域对象。 Config 对象之间存在层次关系(一个Config [:OVERRIDES] 另一个Config)。因此,给定一个最底层的Config,我需要一直向上到最顶层的Config,并沿途收集Config 对象的所有属性,将它们合并为一个最终的Config。但我不知道如何使用 Spring Data 来做到这一点。
这是 2 个Config 对象的架构:
CREATE (c1:Config {name:'ConfigParent'});
SET c2.docker_tag='1.0.0';
SET c2.mem_limit='1gb';
MATCH (c1:Config {name: 'ConfigParent'})
CREATE (c2:Config {name:'ConfigChild'})-[:OVERRIDES]->(c1)
SET c2.docker_tag='1.0.1';
ConfigChild 属性需要与ConfigParent 合并,ConfigParent 中的任何重复属性都将被覆盖。所以我的最后一组属性应该是:
name='ConfigMerged' //I don't know what this name would be?
docker_tag='1.0.1'
mem_limit='1gb'
Config 中可以有任何键/值对,因此它们不能按名称返回。我想出了这个 CQL,我认为它可以满足我的需求:
MATCH p = SHORTESTPATH((c2:Config)<-[:OVERRIDES*]-(c1:Config))
WHERE c1.name = 'ConfigChild' and not (c2)-[:OVERRIDES]->()
UNWIND NODES(p) as props return PROPERTIES(props);
JSON 响应如下所示:
[
{
"keys": [
"properties(props)"
],
"length": 1,
"_fields": [
{
"name": "ConfigParent",
"docker_tag": "1.0.0",
"mem_limit": "1gb"
}
],
"_fieldLookup": {
"properties(props)": 0
}
},
{
"keys": [
"properties(props)"
],
"length": 1,
"_fields": [
{
"name": "ConfigChild",
"docker_tag": "1.0.1"
}
],
"_fieldLookup": {
"properties(props)": 0
}
}
]
问题是,我不知道如何将其映射到 POJO。我需要Config 域对象还是Properties 域对象?这是实现我目标的最佳 CQL 吗?
更新:我为Config 提出了一个带注释的 POJO。但是当我尝试用代码返回它时,properties 总是空的,还有parentConfig。
@NodeEntity
public class Config {
@Id
@GeneratedValue
private Long id;
@Relationship(type = "OVERRIDES")
private Config parentConfig;
@Properties(allowCast=true)
private Map<String, String> properties;
....
}
这是我正在测试的基本查询,只是为了看看我是否可以映射到 POJO:
@Query("MATCH (c1:Config) RETURN c1;")
List<Config> findConfigAny(@Param("configName") String configName);
【问题讨论】:
-
你用 spring-data-neo4j 标记了这个;所以你不是已经有一个代表这个的带有spring注释的pojo吗?然后只需将路径从没有父节点的配置节点返回到没有子节点的配置节点。除非您需要折叠密码中的值,否则为什么您的 neo4j 数据不能反映您正在使用的实际对象?
-
不,我不知道。我想不出合适的pojo。这就是我问问题的原因。
-
我没有专门用过spring-data-neo4j,但是spring-data系列的重点是能够轻松访问/保存你的数据,而不需要知道数据库长什么样。您可能应该更多地阅读 spring-data-neo4j,并首先创建您的 POJO。如果您不是 Neo4j 中数据的所有者,我不确定您将如何在其上使用 spring-data-neo4j。如果 spring-data-neo4j 对答案不重要,并且您将接受 Cypher 返回合并的地图而不是 POJO,那么我可以提供帮助。 (或按顺序排列的设置列表,如果您需要保留该信息)
-
请看我的更新和赏金...,
-
您能分享您的
find()代码吗?带注释的 POJO 看起来是正确的。另外,我希望查找失败会返回 null,您的数据库中是否有一个空的 Config 节点?
标签: neo4j spring-data spring-data-neo4j