当前位置: 首页 > 知识库问答 >
问题:

spring-data-neo4j:不能用相同的标签创建两个关系属性

庄弘业
2023-03-14
@NodeEntity
public class Person {

    @GraphId Long id;
    public String name;

    public Person() {}
    public Person(String name) { this.name = name; }

    @RelatedTo(type="MEMBER_OF", direction=Direction.OUTGOING)
    Dojo dojo;

    @RelatedTo(type="MEMBER_OF", direction=Direction.OUTGOING)
    MailingList mailingList;

    public void setDojo(Dojo dojo) {
        this.dojo = dojo;
    }
    public void setMailingList(MailingList mailingList) {
        this.mailingList = mailingList;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + "]";
    }
}

java:

@NodeEntity
public class Dojo {

    @GraphId Long id;
    public String name;

    public Dojo() { }
    public Dojo(String name) { this.name = name; }

    @Override
    public String toString() {
        return "Dojo [name=" + name + "]";
    }
}

MailingList.java:

@NodeEntity
public class MailingList {

    @GraphId Long id;
    public String name;

    public MailingList() { }
    public MailingList(String name) { this.name = name; }

    @Override
    public String toString() {
        return "MailingList [name=" + name + "]";
    }

}

application.java:

@Configuration
@EnableNeo4jRepositories(basePackages = "hello")
public class Application extends Neo4jConfiguration implements CommandLineRunner {

    public Application() {
        setBasePackage("hello");
    }

    @Bean
    GraphDatabaseService graphDatabaseService() {
        return new GraphDatabaseFactory().newEmbeddedDatabase("accessingdataneo4j.db");
    }

    @Autowired
    PersonRepository personRepository;

    @Autowired
    GraphDatabase graphDatabase;

    public void run(String... args) throws Exception {
        Transaction tx = graphDatabase.beginTx();
        try {
            Person linus = new Person("Linus");
            linus.setDojo(new Dojo("Coding Dojo"));
            linus.setMailingList(new MailingList("Kernel Mailing List"));

            personRepository.save(linus);

            tx.success();
        } finally {
            tx.close();
        }
    }

    public static void main(String[] args) throws Exception {
        FileUtils.deleteRecursively(new File("accessingdataneo4j.db"));

        SpringApplication.run(Application.class, args);
    }
}
@NodeEntity
public class Person {

    @GraphId Long id;
    public String name;

    public Person() {}
    public Person(String name) { this.name = name; }

    @RelatedTo(type="MEMBER_OF_DOJO", direction=Direction.OUTGOING)
    Dojo dojo;

    @RelatedTo(type="MEMBER_OF_LIST", direction=Direction.OUTGOING)
    MailingList mailingList;

    public void setDojo(Dojo dojo) {
        this.dojo = dojo;
    }
    public void setMailingList(MailingList mailingList) {
        this.mailingList = mailingList;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + "]";
    }
}

从这个例子中我的理解是,spring-data-neo4j将不允许一个类拥有两个具有相同标签的属性。在某些情况下,不同的关系需要有相同的标签--例如,为了符合建模标准。是否可以在spring-data-neo4j中设置多个同名关系?如果是,怎么做?

共有1个答案

柏修洁
2023-03-14

我已经找到了这个问题的答案。我要查找的是文档中描述的“EnforceTargetType”属性。

我创建了一个使用此修复的存储库分支。它可以在https://github.com/spencerhrob/gs-accessing-data-neo4j/tree/same-name-enforce-target找到。

person.java:

@NodeEntity
public class Person {

    @GraphId Long id;
    public String name;

    public Person() {}
    public Person(String name) { this.name = name; }

    @RelatedTo(type="MEMBER_OF", direction=Direction.OUTGOING, enforceTargetType=true)
    Dojo dojo;

    @RelatedTo(type="MEMBER_OF", direction=Direction.OUTGOING, enforceTargetType=true)
    MailingList mailingList;

    public void setDojo(Dojo dojo) {
        this.dojo = dojo;
    }
    public void setMailingList(MailingList mailingList) {
        this.mailingList = mailingList;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + "]";
    }
}
 类似资料:
  • 我现在的解决办法是先保存所有的ArchitectureUnitState节点,从数据库中再次检索它们,将一个节点映射到另一个节点,然后再次保存它。这样,可以创建关系,但我需要保存两次。

  • 在使用@RepositoryRestResource将域对象导出到Rest时,如何在Java中创建Neo4j关系?

  • 我正在创建一个简单的社交图,用户可以在其中创建一个帖子,标记它,并对它进行评论。我用py2neo做模型。该模型具有和作为节点。用户在上、或。在我的例子中,单个用户可以在单个上创建多个或(就像其他任何社交网络一样)。根据我的模型,这需要多个或关系,但具有不同的属性。模型是这样建立的: 我运行以下操作来构建图形: 我希望有两个关系,如下所示: 但我看到事实并非如此: 那么,我的问题是双重的。(1)可以

  • 我使用一个Android库,它要求我创建两个类,每个类继承自不同的类 (具有公共基类) 现在我有这个代码: 我必须复制这个类来创建一个扩展,即使我的两个类共享完全相同的代码。 我简化了示例的代码,但重复可能很重要 我决定将代码放在这两个类之外的静态方法中,并在类重写的方法中调用它们,但我认为必须有一种更干净的方法来做到这一点。 你能帮我解决这个问题吗? 和都继承自。

  • 但是我有两种回购方式 如何创建两个bean,其中一个是用注入的,另一个是用注入的?

  • 尝试在 工作,并将标签应用于创建的节点。 Q1.我可以告诉SDN只附加作为标签,并避免 Q2。如果没有,那么我如何将和标签附加到所有用户节点。目前只附加了标签 编辑: 问题1: 在我以前的SDN版本(即)中,突然查询开始工作,但在类似查询的存储库中失败,但适用于或 问题2: 当我更新我的SDN或Neo4j版本时,我得到了奇怪的异常,这就是为什么我没有更新我的SDN和Neo4j版本。 刚才我将SDN