所以,这是场景:
spring-data-neo4j以下代码基于示例代码Cineasts:
public interface CrewRepository extends GraphRepository<Crew> {
Iterable<Crew> findByNameLike(String name);
@Query("start thinker=node({0}) match thinker-[:crews]-crews return crews")
Set<Crew> findByThinker(Long thinkerId);
}
Run Code Online (Sandbox Code Playgroud)
这里没有消息.问题是:查询findByNameLike不起作用,而findByThinker确实如此.
我已多次修改我的日志配置文件 - 最终版本是下面的版本 - 但是,无论我尝试什么,我都看不到任何查询被记录 - 无论是在我的日志文件还是在服务器上.
<logger name="org.neo4j">
<level value="DEBUG" />
<appender-ref ref="console" />
</logger>
<logger name="org.springframework.data.neo4j">
<level value="DEBUG" />
<appender-ref ref="console" />
</logger>
<root>
<priority value="error" />
<appender-ref ref="console" />
</root>
Run Code Online (Sandbox Code Playgroud)
我想要的只是记录查询,所以我可以看到它是否是一个错误,spring-data-neo4j或者我是否遗漏了什么......我已经查看了两个文档,代码示例,找不到任何具体的内容.
有帮助吗?谢谢!
我在Spring Data Neo4j项目中使用了Neo4j的简单和高级映射模式.由于我已经从简单映射切换到高级映射,因此该项目的性能非常好,我的意思是真的比以前好多了.我没有确切的数字,但肯定是众多.有人可以澄清为什么高级映射模式优于简单映射吗?
我已经阅读了SDN文档中的Prorgramming Model页面,但我找不到确切的原因.
为了记录,我正在使用Spring的@Transactional支持.
我发现有一个名为GraphRepository的接口.我有一个存储库,供用户实现自己的接口来完成它的工作,但我想知道,我不应该实现GraphRepository吗?即使它实现的时间很长而某些方法也没用,我认为它是一个标准,我已经重新编写了很多在这个接口中定义的方法.
那么我应该写"YAGNI"代码还是不尊重标准?你有什么建议?
我完全是新手Neo4j,这些天我正在测试它。我遇到的一个问题是如何正确实现涉及 3 个不同节点的关系,使用Spring Data. 举个例子,我有3个@NodeEntityS: User,Tag和TaggableObject。
正如您可以争论的那样, aUser可以将 a 添加Tag到 a TaggableObject;我用一个@RelationshipEntity TaggingOperation. 但是,我找不到一种简单的方法来粘合关系中的 3 个实体。我的意思是,显而易见的选择是设置@StartNode User tagger和@EndNode TaggedObject taggedObject;但我怎样才能将 加入Tag到关系中?
我创建了新的应用程序,它应该通过存储库将Person对象保存到neo4j.但是当我使用findAll方法时,我没有任何itmes.
我正在使用Spring Boot,这是我的conf:
package com.example;
import org.neo4j.ogm.session.Session;
import org.neo4j.ogm.session.SessionFactory;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.data.neo4j.config.Neo4jConfiguration;
import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
import org.springframework.data.neo4j.server.Neo4jServer;
import org.springframework.data.neo4j.server.RemoteServer;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* Created by Sebastian on 2015-11-07.
*/
@Configurable
@EnableNeo4jRepositories(basePackages = "com.example")
@EnableTransactionManagement
@ComponentScan(basePackages = "com.example")
public class Neo4JPersistanceConfiguration extends Neo4jConfiguration{
@Override
@Bean
public Neo4jServer neo4jServer() {
Neo4jServer server = new RemoteServer("http://localhost:7474","neo4j","welcome1");
return server;
}
@Override
@Bean
public SessionFactory getSessionFactory() {
return new SessionFactory("com.example");
}
}
Run Code Online (Sandbox Code Playgroud)
库:
@Repository
public interface PersonRepository …Run Code Online (Sandbox Code Playgroud) 我根据NodeEntity的Enum属性查询问题.
有问题的NodeEntity定义如下:
@NodeEntity(label = "Entity")
public class MyEntity {
@GraphId
private Long internalId;
....
private State state;
@Transient
public enum State {
STATEONE, STATETWO, STATETHREE
}
....
Run Code Online (Sandbox Code Playgroud)
它保存没有问题,状态Enum表示完美,我可以使用其他属性(字符串)查询完全没有问题.但问题是存储库中的以下查询:
@Query("MATCH (entity:Entity {state:{0}})" +
"RETURN entity")
List<MyEntity> findByState(MyEntity.State state)
Run Code Online (Sandbox Code Playgroud)
即查找具有给定状态的所有实体.
没有例外,但是使用它只会返回0个实体的列表.
我已经尝试了各种各样的变体,例如使用WHERE子句,没有运气.
实体持久存在,在同一测试中使用findAll()返回预期的实体列表,其状态与我期望的完全一致.
有什么想法吗?
我是关于neo4j spring数据的新手,我试图在我的spring启动应用程序上运行它的查询,但是在neo4j web界面上工作.
我在数据库上有3个节点:"oracle","java"和"cloud"我正在尝试运行的查询:
MATCH(interest:Interest) WHERE interest.name =~ '(?i).*cl.*' RETURN interest
Run Code Online (Sandbox Code Playgroud)
所以,使用neo4j web界面,如果我把"cl"它返回"oracle"和"cloud",这是正确的.
使用spring数据,我得到所有3个结果,这是错误的.
我的存储库界面:
@Query("MATCH(interest:Interest) WHERE interest.name =~ '(?i).*{0}.*' RETURN interest")
Set<Interest> getKindOf(String value);
Run Code Online (Sandbox Code Playgroud)
我的休息控制器:
@ResponseBody
public Collection<Interest> getPersonByName(@PathVariable String name) {
Set<Interest> interests = interestRepository.getKindOf(name);
return interests;
}
Run Code Online (Sandbox Code Playgroud)
检查Spring启动日志我可以看到查询:
INFO 12716 --- [nio-2016-exec-1] o.n.o.drivers.http.request.HttpRequest : Thread: 22, url: http://localhost:7474/db/data/transaction/commit, request: {"statements":[{"statement":"MATCH(interest:Interest) WHERE interest.name =~ '(?i).*{0}.*' RETURN interest","parameters":{"0":"cl"},"resultDataContents":["graph"],"includeStats":false}]}
Run Code Online (Sandbox Code Playgroud)
所以,问题是:为什么我使用neo4j web界面获得2个结果(OK),使用spring数据(NOK)获得3个结果?
谢谢您的帮助!
罗德里戈
我有一个大图模型,我需要将以下查询的结果写入csv.
Match (u:USER)-[r:PURCHASED]->(o:ORDER)-[h:HAS]->(i:ITEM) return u.id as userId,i.product_number as itemId
Run Code Online (Sandbox Code Playgroud)
它表明估计结果约为9M.我的问题是:
1)获得响应需要很多时间.从neo4j-shell开始需要38分钟!这是正常的吗?顺便说一下,我有所有的模式索引,它们都是在线的.
2)当我使用SpringDataNeo4j获取结果时,它会抛出"java.lang.OutOfMemoryError:GC开销超出限制"错误,当SDN尝试将加载的数据转换为@QueryResult对象时会发生这种情况.
我尝试以各种方式优化查询,但没有任何改变!我的印象是我做错了什么.有谁知道如何解决这个问题?我应该去批量读/写吗?
PS我正在使用Neo4j社区版本:3.0.1,这些是我的sysinfos:

这些是我的服务器配置.
dbms.jvm.additional=-Dunsupported.dbms.udc.source=tarball
use_memory_mapped_buffers=true
neostore.nodestore.db.mapped_memory=3G
neostore.relationshipstore.db.mapped_memory=4G
neostore.propertystore.db.mapped_memory=3G
neostore.propertystore.db.strings.mapped_memory=1000M
neostore.propertystore.db.index.keys.mapped_memory=500M
neostore.propertystore.db.index.mapped_memory=500M
Run Code Online (Sandbox Code Playgroud) 背景 如果我使用 Spring Data,我正试图找出将 UUID 添加到 neo4j 的正确方法。
我见过:https :
//dzone.com/articles/assigning-uuids-neo4j-nodes
,这里 aTransactionEventHandler用于在必要时插入 UUID。但是制作本教程的人并没有使用 spring 数据。
我也看过这个人的代码:https : //github.com/spring-projects/spring-data-neo4j/blob/master/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/ web/domain/User.java他们似乎在使用 java 的 java.util.UUID,然后将其转换为字符串并将其用作字符串实体并对其进行索引并从那里开始。这似乎是最简单的方法。
但是,在文档中:https : //docs.spring.io/spring-data/neo4j/docs/current/reference/html/他们似乎使用 UUID 作为他们的用例示例AddUuidPreSaveEventListener
问题
我应该使用哪种方法来添加 UUID?
我可以添加吗
...
import java.util.UUID;
import org.neo4j.ogm.annotation.Index;
import org.neo4j.ogm.annotation.typeconversion.Convert;
import org.neo4j.ogm.typeconversion.UuidStringConverter;
...
@Convert(UuidStringConverter.class)
@Index(unique = true, primary = true)
private UUID uuid = UUID.randomUUID();
...
Run Code Online (Sandbox Code Playgroud)
到我的 GraphType.java 文件并称它为好?
注意:我对所有这些技术都很陌生,可能仍然太缺乏经验,甚至无法就这些东西正确提问。
注 2:我之前看过图形感知 UUID 库,它似乎是最新的,但我认为如果我使用 spring 数据,可能有一种首选方法来制作 UUID。
我想批量删除使用密码存在的所有索引可以完成吗?我正在使用 neo4j 3.4.7。
DROP INDEX ON :Label(attributename)
Run Code Online (Sandbox Code Playgroud)
如果我在稍后阶段创建相同的索引,它是否会替换现有索引?
neo4j ×10
spring ×4
java ×3
spring-boot ×2
cypher ×1
neo4j-ogm ×1
nosql ×1
performance ×1
spring-data ×1
spring-mvc ×1