标签: spring-data-graph

在Neo4j/Spring-Data中加载/获取Lazy/Eager

我有一个简单的设置,遇到一个令人费解的(至少对我来说)问题:

我有三个相互关联的pojos:

@NodeEntity
public class Unit {
    @GraphId Long nodeId;
    @Indexed int type;
    String description;
}


@NodeEntity
public class User {
    @GraphId Long nodeId;
    @RelatedTo(type="user", direction = Direction.INCOMING)
    @Fetch private Iterable<Worker> worker;
    @Fetch Unit currentUnit;

    String name;

}

@NodeEntity
public class Worker {
    @GraphId Long nodeId;
    @Fetch User user;
    @Fetch Unit unit;
    String description;
}
Run Code Online (Sandbox Code Playgroud)

所以你有User-Worker-Unit有一个"currentunit",它在用户中标记允许直接跳转到"当前单位".每个用户可以有多个工作人员,但只有一个工作人员被分配到一个单元(一个单元可以有多个工作人员).

我想知道的是如何控制"User.worker"上的@Fetch注释.我实际上希望这只在需要的时候加盖,因为大多数时候我只和"工人"一起工作.

我浏览了http://static.springsource.org/spring-data/data-neo4j/docs/2.0.0.RELEASE/reference/html/,对我来说并不是很清楚:

  • worker是可迭代的,因为它应该是只读的(传入关系) - 在文档中这是明确说明的,但是在示例中''Set''在大多数情况下被使用.为什么?或者不重要......
  • 如何让工作人员只加载访问权限?(懒加载)
  • 为什么我需要用@Fetch注释简单的关系(worker.unit).有没有更好的方法?我有另外一个与MANY这样简单关系的实体 - 我真的想避免因为我想要一个对象的属性而加载整个图形.
  • 我错过了一个弹簧配置,所以它适用于延迟加载?
  • 有没有办法通过额外的呼叫加载任何关系(没有标记为@Fetch)?

从我的看法来看,这个构造只要我想要一个Worker就加载整个数据库,即使我大部分时间都不关心用户.

我发现的唯一解决方法是使用存储库并在需要时手动加载实体.

-------更新-------

我已经使用neo4j很长一段时间了,并找到了上述问题的解决方案,不需要一直调用fetch(因此不会加载整个图形).唯一的缺点:它是运行时方面:

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import …
Run Code Online (Sandbox Code Playgroud)

neo4j spring-data-graph spring-data-neo4j

15
推荐指数
1
解决办法
6305
查看次数

构建基于Neo4j的应用程序 - 使用普通节点和关系坚持使用vanilla API或使用Spring/GORM?

我希望听到任何一个已经构建并实现了大小合适的Neo4j应用程序(10百万个节点/ rels)的人 - 以及你的建议特别是建模和各种API(vanilla java/groovy Neo4j vs Spring-Data) -Neo4j vs Grails GORM/Neo4j).

我感兴趣的是,它是否真的能够为添加额外的OGM(对象图形映射)层和相关的抽象而付出代价?

有没有人的经验是,最好坚持使用节点+属性,关系+属性,遍历和(例如)Cypher来建模和存储数据的"普通"图形建模?

我担心的是,将特定的OGM抽象"强制"到图形数据库中会影响未来调整/更改域模型的灵活性和/或查询数据的灵活性.

我们是Grails商店,我已经尝试过GORM/Neo4J以及spring-data-neo4j.

数据集的主要目的是建模和查询v.large数量的人,他们的别名,他们的同事以及各种犯罪活动和历史之间的关系.将有超过50个主域名类.模型必须具有灵活性(需要在项目的早期阶段快速发展)以及查询的速度和灵活性.

我必须承认,当我可以使用(例如)POJO或POGO,一点Groovy魔术和一些简单的手动域对象< - >节点/关系映射代码时,我很难找到使用OGM层的令人信服的理由.据我所知,我想我会很高兴只处理节点和遍历和Cypher(又名KISS).但我很乐意听取别人的经验和建议.

谢谢你的时间和想法,

TP

grails grails-orm neo4j spring-data-graph spring-data-neo4j

10
推荐指数
1
解决办法
1787
查看次数

在SDG 2.0中获取注释,获取策略问题

嗨所有患者开发者使用弹簧数据图表.由于文档较少且测试覆盖率非常差,因此有时很难理解底层框架的预期行为,框架应该如何工作.目前我有一些与SDG 1.1中引入的新获取方法有关的问题.与SDG 1.1相反,在2.0中写入\ read through只关系和用@Fetch注释注释的相关对象被急切地获取其他人应该被懒惰地取出...现在我的第一个问题:

  • 是否可以配置SDG,以便在同一事务中加载实体并在惰性关系上调用getter时,会自动获取请求的集合?事务范围中的持久性上下文类型,或者可能是针对功能发布进行规划的.
  • 如何为@RelatedTo注释一次获取延迟集合?来自Neo4jOperation的fetch()方法允许仅获取一个实体.我是否必须遍历整个列表并获取每个对象的实体?检查给定对象是否已被提取/初始化的最佳方法是什么?
  • 作为建议,我认为如果在使用未初始化的对象时会抛出延迟加载异常而不是获取NPE,那将更直观.此外,该行为具有误导性,因为当对象未初始化且所有成员属性与id无关时,equals方法可以为尚未初始化的不同对象提供true,这是非常严重的问题,例如考虑集合的设备
  • 我在使用SDG 2.0.0.RC1时注意到的另一个问题如下:当我将新对象添加到未获取的集合时,有时会正确添加并保留,但有时不会.我为这个案例写了测试,它以非确定性的方式工作.有时失败有时会以成功结束.以下是用例:

    Group groupFromDb = neoTemplate.findOne(group.getId(), Group.class);
    assertNotNull(groupFromDb);
    assertEquals("Number of members must be equals to 1", 1,    groupFromDb.getMembers().size());
    User secondMember = UserMappingTest.createUser("secondMember");
    groupFromDb.addMember(secondMember);
    neoTemplate.save(groupFromDb);
    Group groupAfterChange = neoTemplate.findOne(groupFromDb.getId(), Group.class);
    assertNotNull(groupAfterChange);
    assertEquals("Number of members must be equals to saved entity", groupFromDb.getMembers().size(), groupAfterChange.getMembers().size());
    assertEquals("Number of members must be equals to 2", 2, groupAfterChange.getMembers().size());
    
    Run Code Online (Sandbox Code Playgroud)

这个测试有时在最后一个断言上失败,这意味着有时会将成员添加到集合中,有时不会.我猜这个问题出现在ManagedFieldAccessorSet的某个地方,但很难说因为这是不确定的.我用mvn2和mvn3用java 1.6_22和1​​.6_27运行测试,我总是得到相同的结果:有时候确定有时测试失败.User等的实现如下:

@Override
public boolean equals(final Object other) {
    if ( !(other instanceof User) ) {
        return false;
    }
    User castOther …
Run Code Online (Sandbox Code Playgroud)

spring neo4j nosql spring-data-graph

6
推荐指数
1
解决办法
968
查看次数

使用Spring Data neo4j比直接使用neo4j有什么好处?

我是NOSQL数据库(或任何类型的数据库)的新手,我需要用Java构建一个图形数据库.我之前从未使用过SpringSource.使用Spring Data neo4j会使创建图形数据库的过程变得更容易,还是会使事情复杂化?我应该尝试直接使用neo4j吗?非常感谢你.

springsource neo4j spring-data-graph spring-data-neo4j

6
推荐指数
1
解决办法
1077
查看次数

使用Spring Data Neo4j的简单对象/图形映射来获取事务的正确方法?

我在Spring Data Neo4j 2.0中使用简单的对象/图形映射,在那里我使用Spring Data存储库框架执行持久性操作.我正在使用存储库而不是使用Neo4jTemplate.我将存储库注入我的Spring Web MVC控制器,控制器直接调用repos.(没有中间服务层 - 我的操作通常是CRUD和查找器查询.)

当我读操作时,没有问题.但是当我写操作时,我得到"NotInTransactionException".我的理解是Neo4j中的read操作不需要事务,但是写操作可以.

假设我想坚持使用简单的OGM,那么在这里进行交易的最佳方法是什么?我想要使​​用@Transactional,但是将它放在各种存储库接口上是行不通的.如果我在控制器和存储库之间引入一个中间服务层,然后使用@Transactional注释服务bean,那么它可以工作,但我想知道是否有更简单的方法.如果没有Spring Data,我通常可以访问DAO(存储库)实现,因此如果我想避免传递服务层,我可以用@Transactional注释具体的DAO.使用Spring Data,repos是动态生成的,因此看起来不是一个选项.

spring transactions neo4j spring-data-graph spring-data-neo4j

5
推荐指数
1
解决办法
6074
查看次数

Spring数据neo4j的高级映射与简单映射

我知道使用Spring数据neo4j的高级映射而不是简单的映射有很多优点.

我的问题是在简单映射上使用高级映射的缺点什么

neo4j spring-data-graph spring-data-neo4j

3
推荐指数
1
解决办法
582
查看次数