【问题标题】:How to map entities to existing graph?如何将实体映射到现有图?
【发布时间】:2014-01-16 14:26:35
【问题描述】:

我得到了一个由以下 Cypher 表达式描述的图表:

CREATE
(BMW:Brand {name: "BMW", country: "Germany"}),
(X3:Model {name: "X3", acceleration: 7.1, maxSpeed: 227.5, displacement: 1997, consumption: 6}),
(lastGen:Generation {from: 2013}),
(xDrive20i:Modification {name: "xDrive20i", maxSpeed: 210, acceleration: 8.3, consumption: 7.9}),
(X3)-[:MODEL_OF]->(BMW),
(BMW)-[:MODEL]->(X3),
(lastGen)-[:GENERATION_OF]->(X3),
(X3)-[:GENERATION]->(lastGen),
(xDrive20i)-[:MODIFICATION_OF]->(X3),
(X3)-[:MODIFICATION]->(xDrive20i),
(lastGen)-[:MODIFICATION]->(xDrive20i),
(xDrive20i)-[:MODIFICATION_OF]->(lastGen);

我描述了一个匹配Brand的数据结构的java类:

@NodeEntity
@TypeAlias("Brand")
public class Brand {

    @GraphId
    private Long id;

    @Indexed(indexType = IndexType.FULLTEXT, indexName = "brand_name")
    private String name;

    private String origin;

    private String owner;

    @RelatedTo(type = "MODEL", direction = Direction.OUTGOING)
    private Set<Model> models;

    //getters and setters are ommited
}

和存储库:

public interface BrandRepository extends GraphRepository<Brand>{

    //method's signatures are ommited

}

当我调用brandRepository.count() 时,它会按我的预期返回 1。但是如果我打电话给brandRepository.getOne(2249L) 我会得到一个例外:

java.lang.IllegalStateException: No primary SDN label exists .. (i.e one with starting with __TYPE__)

据我了解阅读LabelBasedNodeTypeRepresentationStrategy 源,节点必须至少有一个带有__TYPE__ 前缀的标签。

鉴于我可能无法更改图形结构,我如何将实体映射到图形?

如果没有其他方法,我不介意实现我自己的自定义 LabelBasedNodeTypeRepresentationStrategy。但在这种情况下,有人可以让我知道为什么它是这样实现的(我认为这不是偶然的)以及我应该如何将自定义解决方案绑定到 spring-data-neo4j 使用它?

我使用 neo4j-2.0.0-M06 和 spring-data-neo4j-3.0.0.M1。

【问题讨论】:

  • 我没有找到问题的答案,但我以另一种方式解决了我的问题。我改用 Ruby 技术并使用了neo4j gem。它的行为完全符合我的预期,至少不会向我的数据添加元信息。

标签: java spring neo4j spring-data-neo4j


【解决方案1】:

当您存储实体时,SDN 会在您的图表中添加额外的元数据,而您的情况则缺少该元数据。

您可以尝试通过调用自己添加该元数据

neo4jTemplate.postEntityCreation(node, Brand.class);

但例如不索引您的姓名字段(手动旧索引)。

【讨论】:

  • 感谢您的回复。这种方法让我有机会从使用 Cypher 表达式导入的数据中获取实体,但它的代价是元数据会更改数据。我对元数据没有异议,我反对用元数据污染用户空间。
  • 我可以通过任何方式避免数据中存在元数据吗?以及这会如何在未来造成麻烦?
  • @RandomFreeman 是的,不要使用 SDN,使用 neo4j。如果你需要SDN,元数据就不是污染,因为SDN需要元数据,所以你需要元数据。如果你不需要需要(和/或想要)任何 SDN 给你的东西,那就是污染,在这种情况下,如果这个“污染问题”对你来说很重要,你应该考虑使用 java直接使用 API。
  • @Micheal Hunger 当你想用 repo.deleteAll() 删除一个节点时怎么样?我遇到了同样的错误,即使我所有的节点都是用 SDN 创建的,它似乎也是突然出现的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多