Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于端点子类类型的Neo4j-判别关系_Neo4j_Spring Data Neo4j 4_Neo4j Ogm - Fatal编程技术网

基于端点子类类型的Neo4j-判别关系

基于端点子类类型的Neo4j-判别关系,neo4j,spring-data-neo4j-4,neo4j-ogm,Neo4j,Spring Data Neo4j 4,Neo4j Ogm,我注意到,当在spring-data-neo4j 4数据模型中使用继承时,在基于结束节点类型加载和区分关系时,超类被用作鉴别器。有没有办法强制spring-data-neo4j-4使用子类作为鉴别器 例如,假设我们有一个数据模型(类图),左侧如下图所示,右侧为其neo4j数据库表示 目前,如果我们有一个业主实体,其代码如下: @NodeEntity class Owner extends BaseNodeEntity { ... @Relationship(type="OW

我注意到,当在spring-data-neo4j 4数据模型中使用继承时,在基于结束节点类型加载和区分关系时,超类被用作鉴别器。有没有办法强制spring-data-neo4j-4使用子类作为鉴别器

例如,假设我们有一个数据模型(类图),左侧如下图所示,右侧为其neo4j数据库表示

目前,如果我们有一个业主实体,其代码如下:

@NodeEntity
class Owner extends BaseNodeEntity {

    ...

    @Relationship(type="OWNS")
    private Set<Dog> dogs; // both dog and cat are mapped here

    @Relationship(type="OWNS")
    private Set<Cat> cats; // both dog and cat are mapped here

    ...
}
当然,映射行为应该是一致的。这可能是SDN-4中的错误吗

2016年5月8日更新

很抱歉,此更新延迟。我刚刚有机会再次开始这个项目。我重新测试了这一点,得到了与最新稳定的neo4j版本相同的结果

<neo4j.version>2.3.2</neo4j.version>
<sdn.version>4.1.1.RELEASE</sdn.version>
<java.version>1.8</java.version>
<neo4j-ogm.version>2.0.1</neo4j-ogm.version>
<spring-data-commons.version>1.12.1.RELEASE</spring-data-commons.version>
2.3.2
4.1.1.1发布
1.8
2.0.1
1.12.1.发布
我在下面附上了测试用例中使用的实际域模型。有关测试用例的详细信息,请参见。测试用例代码为:

    @Test
    public void saveAndLoadTags() { 
        log.info("Given we have a member with some events");
        Member member = createMember();
        Event event1 = eventService.createEvent("Event1", member);
        Event event2 = eventService.createEvent("Event2", member);

        log.info("When I tag my events with some tags");
        contentService.tag("Tag1", "", event1, member);
        contentService.tag("Tag1", "", event1, member); // should create no new tags or relationships
        contentService.tag("Tag2", "", event1, member);
        contentService.tag("Tag2", "", event2, member);

        log.info("Then my events should be appropriately tagged");
        event1 = eventService.loadEventBySceneId(event1.getSceneId());
        assertThat(event1.getTags().size(), is(equalTo(2)));
        assertThat(event2.getTags().size(), is(equalTo(1)));

        log.info("And I should have created two tags total");
        Iterator<Tag> iterator = contentService.getAllTags().iterator();
        List<Tag> tags = StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false).collect(Collectors.<Tag> toList());
        assertThat(tags.size(), is(equalTo(2)));

        log.info("And our member should have created two tags");
        member = memberService.loadMemberByEmailAddressPasswordAccount(emailAddress);

        // **************************************************************
        // member.getCreatedTags().size() more often than not returns 3   causing my test failure!
        // **************************************************************
        assertThat(member.getCreatedTags().size(), is(equalTo(2)));
    }
@测试
public void saveAndLoadTags(){
log.info(“假设我们有一个成员参与了一些活动”);
Member=createMember();
event1=eventService.createEvent(“event1”,成员);
event2=eventService.createEvent(“event2”,成员);
log.info(“当我用一些标记标记我的事件时”);
tag(“Tag1”,“”,event1,member);
contentService.tag(“Tag1”,“”,event1,member);//不应创建新的标记或关系
tag(“Tag2”,“”,event1,member);
tag(“Tag2”,“”,event2,member);
log.info(“那么我的事件应该被适当地标记”);
event1=eventService.loadEventBySceneId(event1.getSceneId());
断言(event1.getTags().size(),is(equalTo(2));
断言(event2.getTags().size(),是(equalTo(1));
log.info(“我应该总共创建两个标记”);
迭代器迭代器=contentService.getAllTags().Iterator();
List tags=StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator,Spliterator.ORDERED),false);
断言(tags.size(),是(等于(2));
log.info(“我们的会员应该创建了两个标签”);
member=memberService.loadMemberByEmailAddressPasswordAccount(emailAddress);
// **************************************************************
//member.getCreatedTags().size()经常返回3,导致测试失败!
// **************************************************************
断言(member.getCreatedTags().size())为(equalTo(2));
}
测试用例显示的问题

以下方法:

public Member loadMemberByEmailAddressPasswordAccount(String emailAddress) { 
        Filter filter = new Filter("email", emailAddress);
        Collection<EmailAddressPasswordAccount> emailAddressPasswordAccounts = session.loadAll(EmailAddressPasswordAccount.class, filter, 2);
        return emailAddressPasswordAccounts.isEmpty() ? null : emailAddressPasswordAccounts.iterator().next().getMember();
    }
公共成员loadMemberByEmailAddressPasswordAccount(字符串emailAddress){
过滤器过滤器=新过滤器(“电子邮件”,emailAddress);
集合emailAddressPasswordAccounts=session.loadAll(EmailAddressPasswordAccount.class,筛选器,2);
返回emailAddressPasswordAccounts.isEmpty()?null:emailAddressPasswordAccounts.iterator().next().getMember();
}
返回一个成员对象,该对象具有一组包含2个标记的CreatedTag和一个实际上是事件的标记

我的实际域模型如下(未简化为猫狗):

其他信息:

我已尝试使用@NodeEntity注释来注释除BaseNodeEntity之外的所有模型对象。属性被注释

2016年5月9日更新


如果我使用存储库上的派生查找程序交换loadMemberByEmailAddressPasswordAccount的ogm代码,我会得到相同的间歇性结果。

上述情况涉及具有相同类型但不同终端节点类型的关系集合,这是一个错误-


这已被修复,可在Neo4j OGM 2.0.2中使用

谢谢你的代码,我会看一看我已经打开了谢谢,谢谢你的代码。你太棒了!:)谢谢你,卢安!已将新版本整合到我们的最新版本中,并且我们的内部测试现在已全部通过:)
public Member loadMemberByEmailAddressPasswordAccount(String emailAddress) { 
        Filter filter = new Filter("email", emailAddress);
        Collection<EmailAddressPasswordAccount> emailAddressPasswordAccounts = session.loadAll(EmailAddressPasswordAccount.class, filter, 2);
        return emailAddressPasswordAccounts.isEmpty() ? null : emailAddressPasswordAccounts.iterator().next().getMember();
    }