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

具有spring-data-neo4j的唯一子节点

高嘉熙
2023-03-14

我目前正在为我在保险公司的学士论文做一个企业-html" target="_blank">架构-管理-系统。该公司希望将所有自制的应用程序(应用程序节点)显示在Neo4J-图形数据库中,并将Webservice依赖关系作为关系。除了应用程序,该公司还希望持久化应用程序的[Maven]版本(Version-Node)(HAS_VERSION关系),因为新版本可能有新的依赖关系或丢失旧的依赖关系(USES-关系)。这就是我的观点。我想为每个应用程序实例提供唯一的Version子节点。如:

APPLICATION FooHAS_VERSION1.0;1.1;2.0和APPLICATION BarHAS_VERSION1.0;2.0;3.0;但是两个应用程序的版本节点1.0和2.0应该是单独的节点。因此,这个例子应该在图形数据库中总共显示8个节点(2个应用程序和6个版本)。他们是一个简单的方法来实现这与sping-data-neo4j?我已经尝试在我的应用程序POJO类的版本集中使用@Unique注释。但是这导致每个版本都有唯一的节点。所以上面的例子在数据库中显示了6个节点(2个应用程序和4个版本)。两个应用程序都与版本节点1.0和2.0有HAS_VERSION关系。但是我希望每个应用程序明确唯一的版本-"子节点",因为与依赖应用程序的版本的USES关系应该在数据库中直接可见。与唯一的Version节点它不是。

我还实施了一种自制的方法来做到这一点。但是它不是很有效,因为我确实在数据库上使用了许多写和读操作。而且有些应用有很多版本。所以@Fetch注释非常浪费资源。现在我很好奇sping-data-neo4j是否已经为我的问题提供了解决方案。他们的东西能有效地解决这个问题吗?

共有1个答案

陶超
2023-03-14

是的,这里有一个Spring数据NEO4J4(当前版本为M1)的示例。请注意如何控制持久性范围或“深度”,以便能够控制相关实体的获取。

应用JAVA

@NodeEntity
public class Application {

    Long id;
    String name;
    @Relationship(type="HAS_VERSION", direction = "OUTGOING")
    Set<Version> versions = new HashSet<>();

    public Application() {
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void addVersion(Version version) {
        versions.add(version);
    }

    public Set<Version> getVersions() {
        return versions;
    }

    public Long getId() {
        return id;
    }
}

Version.java

@NodeEntity
public class Version {

    Long id;

    String versionNumber;

    @Relationship(type = "HAS_VERSION", direction = "INCOMING")
    Application application;


    public Version() {
    }

    public Version(String versionNumber) {
        this.versionNumber = versionNumber;
    }

    public String getVersionNumber() {
        return versionNumber;
    }

    public void setVersionNumber(String versionNumber) {
        this.versionNumber = versionNumber;
    }

    public Application getApplication() {
        return application;
    }

    public void setApplication(Application application) {
        this.application = application;
    }

    public Long getId() {
        return id;
    }
}

存储库

public interface VersionRepository extends GraphRepository<Version> {

}

public interface ApplicationRepository extends GraphRepository<Application>{

}

还有一个测试

     @Test
                public void testDomain() {
                    Application foo = new Application("Foo");
                    Version foo10 = new Version("1.0"); //create a NEW version
                    Version foo11 = new Version("1.1"); //create a NEW version
                    Version foo20 = new Version("2.0"); //create a NEW version
                    foo.addVersion(foo10);
                    foo.addVersion(foo11);
                    foo.addVersion(foo20);
                    applicationRepository.save(foo);

                    Application bar = new Application("Bar");
                    Version bar10 = new Version("1.0"); //create a NEW version
                    Version bar20 = new Version("2.0"); //create a NEW version
                    Version bar30 = new Version("3.0"); //create a NEW version
                    bar.addVersion(bar10);
                    bar.addVersion(bar20);
                    bar.addVersion(bar30);
                    applicationRepository.save(bar);

                    session.clear();

                    assertEquals(2, applicationRepository.count()); //2 apps
                    assertEquals(6, versionRepository.count()); //6 versions

                    session.clear();

                    Application barWithoutVersionsLoaded = 
applicationRepository.findOne(bar.getId(),0); 

       //Depth=0 will only load the application and properties on the application node 
       //but not its related objects. 
       //If you don't specify depth, it defaults to 1
                    assertEquals("Bar", barWithoutVersionsLoaded.getName());
                    assertEquals(0, barWithoutVersionsLoaded.getVersions().size()); //No versions loaded

                }
 类似资料:
  • 我需要创建一个新的A类节点,它与User节点有关系: 现在,假设我们有新节点A的以下数据: 我试图创建节点A,使新节点A与具有“id”:4和“nodeId”:“0002-0002”(唯一节点标识符)的用户的(现有)节点之间具有关系,但用户节点将字段“name”和“firstName”更新为。 我正在使用GraphRespository代理创建它: 有没有办法不进行此更新,只与用户节点建立关系?

  • 今天我尝试了Spring Data Neo4j,我终于让它工作了... 我正在使用: Spring 4.0。2 Spring数据Neo4j 3.0。0 QueryDSL 3.3。1 Neo4j 2.0。一, 这是我的配置: 我的域名类: 和我的仓库: 我可以在DB中成功创建一个用户,然后通过以下方式检索该用户: 但是:如果我现在再次调用我的create代码,它不会抛出异常,因为,它只会覆盖数据库中

  • 我正在为我的第一个Spring Data Neo4j应用程序建模,并想知道如何对@RelationshipEntity类进行子类化-1)可以做到吗,2)这是一个好主意吗? 这里有一个例子,说明了我对使用RSS的看法。 null 这似乎更自然,因为RelationshipEntities是第一类对象:正如我所说,这是我的第一个Neo4j应用程序,所以我不知道这些想法是否好。 从查询的角度来看,我想问

  • 我的项目是基于SpringBootNeo4J的。我正在尝试创建一个新的特权节点,但不想复制特权。 现在我有一个UserRole节点,它是holds

  • 我正在构建一个应用程序,我的用户可以在其中管理字典。一个功能是上传一个文件来初始化或更新字典的内容。 我首先关注的结构部分是

  • Spring Data Neo4J 提供高级特性,将批注的实体类映射到的 Neo4j 图形数据库。它的模块化编程模型相当于知名的 Spring 模块,建立了与图形交互的基础,并且可用于先进储存库支持。Spring Data Neo4j 是 Spring Data 项目的一部分,目标是向 NoSQL 数据库提供便捷支持。