亲爱的,
我使用Spring Boot(1.5.7.RELEASE)和Spring数据neo4j(4.2.7.RELEASE)和neo4j-ogm(2.1.5)创建了一个非常简单的应用程序。
我的pom.xml的相关部分:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-test</artifactId>
<version>${neo4j-ogm.version}</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
我有两个简单的实体和一个父(具有常见的东西):
@NodeEntity
public abstract class BaseEntity {
@GraphId
private Long id;
@Convert(value = InstantConverter.class)
private Instant createdOn;
private Date modifiedOn;
}
public class User extends BaseEntity {
@Index(unique = true)
private String username;
@Index(unique = true)
private String email;
private String password;
public User() {
//default
}
public User(String username, String email, String password) {
this.username = username;
this.email = email;
this.password = password;
}
}
public class Tag extends BaseEntity {
@Index
private String label;
@Relationship(type = "CREATOR")
private User creator;
public Tag() {}
public Tag(String label, User creator) {
this.label = label;
this.creator = creator;
}
}
为清晰起见,我删除了setters / getters / equals / hashcode。
将此配置用于Neo4j,尝试尽可能简单:
@Configuration
@EnableNeo4jRepositories(value = "xxx.repository")
public class Neo4jConfiguration {
@Bean
public NewEntityPreSaveEventListener newEntityPreSaveEventListener() {
return new NewEntityPreSaveEventListener();
}
}
这是我使用的存储库:
@Repository
public interface TagRepository extends GraphRepository<Tag> {
Tag findOneByLabelAndCreator(String label, User creator);
Tag findOneByLabel(String label);
Tag findOneByCreator(User creator);
@Query("MATCH (tag:Tag)-[:CREATOR]->(creator:User) WHERE id(creator) = {creatorId} RETURN tag")
@Depth(value = 5)
Tag getByCreator(@Param("creatorId") User creator);
}
所以没什么特别的,真的......
假设:
User myCreator = userRepository.save(new User("myCreator", "email", "password"));
Tag myTag = tagRepository.save(new Tag("taglabel", myCreator));
当我做&#34; tagRepository.findOneByLabel(&#34; taglabel&#34;)&#34;或者,它返回所有属性设置的标记。完美!
当我执行&#34; tagRepository.findOneByCreator(myCreator)&#34;时,它只返回null。
当我执行&#34; tagRepository.getByCreator(myCreator)&#34;时,它返回带有正确标签的标签但是属性&#34;创建者&#34;是空的。
我真的不明白。当然,我阅读了文档,并尝试了几个方面(@Depth,自定义@Query,在字段上的User类中添加@Relationship&#34;设置标记&#34;,删除索引等)。它根本不想正常工作。 这很简单,我应该错过一些非常非常愚蠢的东西...... 不幸的是,我发现的所有例子都比这个更简单......这不是很有帮助。
有什么想法吗?
提前感谢您的帮助。
答案 0 :(得分:0)
当我执行&#34; tagRepository.findOneByCreator(myCreator)&#34;时,它只返回null。
打开org.neo4j.ogm
的信息记录,并检查生成的密码查询。
当我执行&#34; tagRepository.getByCreator(myCreator)&#34;时,它返回带有正确标签的标签但是属性&#34;创建者&#34;是空的。
请参阅文档的this part:
自定义查询不支持自定义深度。此外,@ Query不支持将路径映射到域实体,因此,不应从Cypher查询返回路径。相反,返回节点和关系以将它们映射到域实体。
所以你需要返回你想要映射的所有节点/关系,而且你需要自己处理查询中的深度。
@Query("MATCH (tag:Tag)-[:CREATOR]->(creator:User) " +
"WHERE id(creator) = {creatorId} WITH tag " +
"MATCH p=(tag)-[*..5]-() " +
"RETURN nodes(p),relationships(p)")
@Depth(value = 5)
Tag getByCreator(@Param("creatorId") User creator);