问题标签 [spring-data-neo4j]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
6137 浏览

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

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

当我进行读取操作时,没有问题。但是当我写操作时,我得到“NotInTransactionException”。我的理解是 Neo4j 中的读取操作不需要事务,但写入操作需要。

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

0 投票
3 回答
6785 浏览

neo4j - Neo4j/Spring-Data 中的延迟/急切加载/获取

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

我有三个彼此相关的pojo:

所以你有一个带有“currentunit”的用户工作单元,它在用户中标记,允许直接跳转到“当前单元”。每个用户可以有多个worker,但是一个worker只分配给一个unit(一个unit可以有多个worker)。

我想知道的是如何控制“User.worker”上的@Fetch注释。我实际上希望仅在需要时才加载它,因为大多数时候我只与“工人”一起工作。

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

  • worker 是可迭代的,因为它应该是只读的(传入关系) - 在文档中明确说明了这一点,但在示例中,大多数时间都使用“Set”。为什么?或者没关系...
  • 如何让工作人员仅在访问时加载?(懒加载)
  • 为什么我甚至需要用@Fetch 注释简单的关系(worker.unit)。没有更好的方法吗?我有另一个具有许多如此简单关系的实体——我真的想避免仅仅因为我想要一个对象的属性而不得不加载整个图表。
  • 我是否缺少弹簧配置,因此它适用于延迟加载?
  • 有没有办法通过额外的调用加载任何关系(未标记为@Fetch)?

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

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

- - - - 更新 - - - -

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

您只需要调整应该应用方面的类路径:my.model.package。.get ())")

我将方面应用于我的模型类上的所有 get 方法。这需要一些先决条件:

  • 你必须在你的模型类中使用getter(方面不适用于公共属性——无论如何你都不应该使用)
  • 所有模型类都在同一个包中(因此您需要稍微调整代码)-我想您可以调整过滤器
  • 需要将 aspectj 作为运行时组件(使用 tomcat 时有点棘手) - 但它可以工作:)
  • 所有模型类都必须实现 BaseObject 接口,该接口提供:

    公共接口 BaseObject { 公共布尔 isFetched(); }

这可以防止双重获取。我只是检查强制的子类或属性(即名称或除 nodeId 之外的其他内容)以查看它是否实际被获取。Neo4j 将创建一个对象,但仅填充 nodeId 并保持其他所有内容不变(因此其他所有内容均为 NULL)。

IE

如果有人找到了一种没有那种奇怪解决方法的方法,请添加您的解决方案:) 因为这个可行,但我会喜欢没有 aspectj 的解决方案。

不需要自定义字段检查的基础对象设计

一种优化是创建一个基类而不是一个实际使用布尔字段(加载布尔值)并检查它的接口(因此您不必担心手动检查)

这是有效的,因为在保存对象“true”时返回加载。当方面查看它使用 isFetched() 的对象时 - 当尚未检索到对象时将返回 null。一旦检索到对象,就会调用 setLoaded 并将加载的变量设置为 true。

如何防止杰克逊触发延迟加载?

(作为评论中问题的答案 - 请注意,我还没有尝试过,因为我没有这个问题)。

对于杰克逊,我建议使用自定义序列化程序(参见http://www.baeldung.com/jackson-custom-serialization)。这允许您在获取值之前检查实体。您只需检查它是否已被提取,然后继续整个序列化或仅使用 id:

弹簧配置

这是我使用的示例 Spring 配置 - 您需要将包调整为您的项目:

AOP 配置

这是 /META-INF/aop.xml 使它工作:

0 投票
2 回答
2465 浏览

nosql - 有没有办法像 Hibernate 一样在 Neo4J 上记录查询?

所以,这里是场景:

  • 我有 Neo4J 服务器在本地运行,其中包含一些数据
  • 我有一个网络应用程序使用spring-data-neo4j

以下代码基于示例代码Cineasts

这里没有消息。问题是:查询findByNameLike不起作用,而查询findByThinker不起作用。

我已经多次修改了我的日志配置文件 - 最终版本是下面的版本 - 但是,无论我尝试什么,我都看不到任何查询被记录在我的日志文件或服务器上。

我想要的只是记录查询,以便我可以查看它是否是错误spring-data-neo4j或我是否遗漏了某些东西......我已经查看了这两个代码示例的文档,但找不到任何具体的内容。

有什么帮助吗?谢谢!

0 投票
2 回答
477 浏览

neo4j - persist() 总是创建新节点

我在使用 SDN 2.0.0.RELEASE 和 Neo4j 1.5 进行索引/持久化时遇到问题。

我有一个域类“Word”,它基本上看起来像这样:

我用这种方法坚持的话:

它应该检查单词是否已经在图表中,如果是,我更改 wordRepository 返回的对象的一些属性,然后保持更改(-> if (existingWord != null))。如果该单词不在图中但它只是持久化(-> else)。

然而,这总是为每个单词创建一个新节点,即使它存在于图中。可以这么说,persist() 总是创建一个新节点。在图中出现两个具有相同 wordString 的单词后,repository 方法会抛出:

这是怎么回事?

我也想知道 IndexType.SIMPLE,IndexType.POINT 和 IndexType.FULLTEXT 之间的区别是什么。(它不在 API 或良好关系指南中)

0 投票
2 回答
2270 浏览

data-modeling - 查找数据模型在线工具...从图片中

我阅读了 Spring Data Neo4j 的文档,发现了这样的图片: 未知来源

这真的很有趣,我也想使用它!你知道生成它的网站是什么吗?我知道它适用于某些脚本语言,但花了几个小时后我没有找到它:(

0 投票
2 回答
1860 浏览

spring - NodeEntity 的唯一约束

我正在使用 Spring Data、Neo4j 和 Jackson 来提供 JSON API。我有一个像这样的简单用户类:

我正在使用URL 中@Indexedid属性。有没有可能将此字段设置为唯一的?(如在 RDBMS 中)

现在我可以创建许多具有相同 id 的用户:

我想要第二个例外,save或者至少我想替换数据库中的第一个用户。

谢谢你。

0 投票
4 回答
5268 浏览

java - CRUDRepository 的保存方法很慢?

我想在我的 neo4j 数据库中存储一些数据。我为此使用 spring-data-neo4j。

我的代码如下:

我的 newRisks-array 包含大约 60000 个对象和 60000 个边。每个节点和边都有一个属性。此循环的持续时间约为 15 - 20 分钟,这正常吗?我使用 Java VisualVM 来搜索一些瓶颈,但我的平均 CPU 使用率为 10 - 25%(4 个核心),而且我的堆还不到一半。

有什么选项可以提升这个操作?


编辑:另外是,在第myRepository.save(newRisks.get(i));一个输出开始前几分钟 jvm 第一次调用睡着 fpr

第二次编辑:

类别风险:

创造风险:

0 投票
1 回答
616 浏览

mongodb - Spring数据neo4j和mogodb混淆了

我一起使用 Spring-data-Neo4J 和 Spring-data-MongoDb。在 UserRepository 上调用 save 方法会产生错误。任何帮助将不胜感激。

我的域类

以下是错误日志:

java.lang.ClassCastException: org.springframework.data.neo4j.support.mapping.Neo4jPersistentEntityImpl 不能转换为 org.springframework.data.mongodb.core.mapping.MongoPersistentEntity org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator。 onApplicationEvent(MongoPersistentEntityIndexCreator.java:79) org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator.onApplicationEvent(MongoPersistentEntityIndexCreator.java:47) org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:97) org. springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:324) org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:263) org.springframework.data.mapping.context.AbstractMappingContext.getPersistentEntity(AbstractMappingContext.java:165) org.springframework.data.mapping.context.AbstractMappingContext.getPersistentEntity(AbstractMappingContext.java:140) org.springframework.data.neo4j.support.Neo4jTemplate。 getPersistentEntity(Neo4jTemplate.java:573) org.springframework.data.neo4j.support.Neo4jTemplate.getMappingPolicy(Neo4jTemplate.java:470) org.springframework.data.neo4j.support.Neo4jTemplate.getMappingPolicy(Neo4jTemplate.java:631) org. springframework.data.neo4j.support.Neo4jTemplate.save(Neo4jTemplate.java:295) org.springframework.data.neo4j.repository.AbstractGraphRepository.save(AbstractGraphRepository.java:106) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun .reflect.NativeMethodAccessorImpl。调用(NativeMethodAccessorImpl.java:39)sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)java.lang.reflect.Method.invoke(Method.java:597)org.springframework.data.repository.core.support。 RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:323) org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:308) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation. java:172) org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) org.springframework.dao。support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) $Proxy82 .save(未知来源) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect .Method.invoke(Method.java:597) org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318) org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java: 172)org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)$Proxy84.save(未知来源)202)$Proxy84.save(未知来源)202)$Proxy84.save(未知来源)

0 投票
1 回答
757 浏览

generics - Hamcrest:当 iterableWithSize 失败时,它会给出一条错误消息,例如“got: com.xxx.MyIterClass$1@1970ae0”

在 hamcrest(1.3.RC2,没有 JUnit 依赖项)中,我无法将 iterableWithSize() 与 SpringDataNeo4j 库一起使用。

我有一个像这样Iterator参数化的(扩展)Content

EndResult在哪里

包 org.springframework.data.neo4j.conversion;公共接口 EndResult 扩展 Iterable {...}

并且Content是一个@NodeEntityPojo。

在马克彼得斯的帮助下,我知道我应该这样称呼它

因为iterableWithSize是在 your 的组件类型上键入的Iterable,而不是在 iterable 本身的具体类型上键入的。

但是当测试运行时我得到

试图弄清楚 1) 我做错了什么,或者 2) hamcrest 或 3) Spring Data Neo4j 是否有错误,我检查了我手头的对象,它似乎可以Iterable

所以我猜它可能会得出结论,它的腿骨有问题。有没有人尝试过与 IsIterableWithSize 类似的东西?

测试代码是https://github.com/anodynos/SpringDataNeo4jTrials/blob/master/src/test/java/sdnTests/test/HamcrestIteratorSizeTest.java

0 投票
1 回答
188 浏览

eclipse - spring-data-neo4j 不使用 storeDirectory 的工作区目录

我的不同示例项目运行良好,但数据库存储在我的 Eclipse 应用程序本身中。我在 OSX 上使用 Eclipse,有什么已知问题吗?到目前为止有人遇到过同样的问题吗?

我确实指定了路径: