Spring Data Neo4j - @RelationshipType问题

3

当关系类型用@RelationshipType字段注释时,我在检索关系时遇到了困难。

虽然Neoclipse中的关系看起来正确,但在我的应用程序中没有检索到任何结果。

不起作用的代码如下(简化版):

@NodeEntity
public abstract class Entity {

    @RelatedToVia
    private Collection<Relationship> relationships;

    public Relationship relatedTo(Entity entity, String type) {
        Relationship relationship = new Relationship(type, this, entity);
        relationships.add(relationship);

        return relationship;
    }

    ...
}

并且:

@RelationshipEntity
public class Relationship {

    @RelationshipType
    private String type;

    ...
 }

能够工作的代码如下:

@RelationshipEntity(type = "something")
public class Relationship {

   ...
}

然而,这并不适合我的使用情况(我有许多不同的关系类型,连接任意组合的实体实例)。
下面是完整的测试代码。 机构物品都是实体的子类。
// Create first entity
Agency arnz = agencyRepository.save(new Agency());
arnz.setCode("ARNZ");
agencyRepository.save(arnz);

// Create second entity
Item r123 = itemRepository.save(new Item());
r123.setCode("R123");

// Create parent/child relationship between entities
r123.relatedTo(arnz, EntityRelationshipType.PARENT);
itemRepository.save(r123);

// Retrieve entity from database
Entity entity = itemRepository.findByCode("R123");

// Verify that relationship is present
assertThat(entity.getRelationships().iterator().hasNext(), is(true));

最后一行是测试失败的地方。有什么线索吗?

M

PS. 我在Neo4j方面是一个业余爱好者,刚好找到了@RelationshipType,所以我可能做错了什么可笑的事情。希望如此!


进一步的实验表明,itemRepository.getRelationshipBetween(r123, arnz, Relationship.class, EntityRelationshipType.PARENT); 返回了预期的关系。然而,这仍然不符合我的用例需求,因此没有太大用处! - nullPainter
此外,继续上面的测试代码,Node node = template.getNode(entity.getId()); 和随后调用 node.getRelationships(); 也能正确返回关系,只是以不太有用的node4j原始Relationship类型返回。因此,显然这是Spring Data实现问题,而不是我的图形基本上出了什么问题? - nullPainter
如果我将集合上的注释更改为@RelatedToVia(direction = Direction.BOTH,type = EntityRelationshipType.PARENT),它就可以工作(即添加一个“类型”)。但这并不是很有用,因为我需要在同一集合中具有异构关系类型。或者这只是框架的限制?我正在使用2.1.0.BUILD-SNAPSHOT。 - nullPainter
现在应该可以了,你可不可以试一下看它是否能正常工作? - Michael Hunger
1个回答

2
很抱歉让您失望,但在检索过程中,代码现在不是寻找类型类,而是寻找来自@RelatedToVia@RelationshipEntity或字段名relationships的关系类型。但您提出了一个有效的观点,能否请您在JIRA上提出一个问题?
您是否研究过template.getRelationshipsBetween
为什么不为您的关系创建单独的类?这种方法的用例是什么?

谢谢Michael,我也怀疑如此。我没有为我的关系创建单独的类的唯一原因是从Java的角度来看更加优雅。我有Entity<-- Relationship --> Entity领域对象,其中Relationship包含年份元数据。每个实体子类之间可能存在大约八种双向关系类型(“Agency is CONTROLLED_BY Series,Series is also CREATED_BY Agency,Series is GOVERNED_BY Series等)。如果这些类在其他方面相同,则创建八个不同的Relationship对象和八个不同的映射有点棘手。 - nullPainter
我确实查看了template.getRelationshipsBetween,它表现良好。但是我正在尝试构建一个数据/图形浏览器 - 用户从搜索结果中选择一个实体,浏览器显示该实体及其相关联的实体,最多深入两层。选择相关实体会将其居中,等等。因此,在任何时候,使用情况都没有明确指定查询前置知识的相关实体。我想另一种选择是只使用RELATED_TO关系“类型”,并将具体信息存储在标准字段中。 - nullPainter
我应该在我的第一条评论中澄清 - Entity 类被子类化以提供额外的字段,但是 Relationship 类对于所有类别都是相同的。因此,我们可以有 Agency <-- Relationship --> SeriesAgency <-- Relationship --> Agency 等等。因此,实体之间的每种关系类型共享一个公共的 Relationship 类作为关系元数据。 - nullPainter
2
实际上,@Michael,我的用例的实现过于幼稚,并且受到了现有遗留系统数据结构的过度影响,该系统由关系数据库支持。在同一双向集合中存储多个关系类型对于我的遍历用例和底层数据结构真的没有意义。如果异构集合对其他人有用,我可能会提出一个JIRA。 - nullPainter
非常感谢。我们有更多的用例,人们希望在关系实体上存储多态数据,并对其使用动态关系类型。因此,它现在已经在JIRA中,并正在进行处理。 - Michael Hunger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接