SDN4中如何获取自定义查询中的直接关系实体和直接相关节点?
How to get the direct relationship entities and directly related nodes in custom query in SDN4?
我的存储库中有一个带注释的查找器方法:
@Query("MATCH (me:User)<-[ab:ASKED_BY]-(q:Question) WHERE id(me) = {0} RETURN q")
Iterable<Question> findQuestionsByUserId(Long id);
我喜欢的对象:
@NodeEntity
public class Question {
private AskedBy askedBy;
@Relationship(type = "TAGGED_WITH")
private Set<Tag> tags = new HashSet<>();
//...
}
@RelationshipEntity(type = "ASKED_BY")
public class AskedBy {
@GraphId private Long id;
@StartNode
private User user;
@EndNode
private Question question;
// other props
}
当我调用存储库方法时,askedBy
字段在结果中是 null
。如何用关系填充该字段?
更新:
我尝试使用会话 loadAll(collection) 加载关系,但没有帮助。
final Collection<Question> questions = (Collection<Question>) questionRepository.findQuestionsByUserId(user.getId());
final Question q = questions.iterator().next();
System.out.println("After `findQuestionsByUserId`:");
System.out.println("`q.getTags().size()`: " + q.getTags().size());
System.out.println("`q.getAskedBy()`: " + q.getAskedBy());
neo4jOperations.loadAll(questions, 1);
System.out.println("After `neo4jOperations.loadAll(questions, 1)`:");
System.out.println("`q.getTags().size()`: " + q.getTags().size());
System.out.println("`q.getAskedBy()`: " + q.getAskedBy());
final Collection<AskedBy> askedByCollection = neo4jOperations.loadAll(AskedBy.class);
System.out.println("`askedByCollection.size()`: " + askedByCollection.size());
上面的代码片段输出
findQuestionsByUserId
之后:
q.getTags().size()
: 0
q.getAskedBy()
: 空
neo4jOperations.loadAll(questions, 1)
之后:
q.getTags().size()
: 1
q.getAskedBy()
: 空
askedByCollection.size()
: 0
自定义查询的默认深度似乎为 0,由于某些未知原因我无法加载关系实体。
图表看起来不错:
目前,自定义查询不支持深度参数(在路线图上),因此您有以下选择-
a) 使用 repository.findOne(userId)
(默认深度为 1,因此它应该加载 AskedBy
)。或者使用 repository.findOne(userId,depth)
自定义深度。或者使用 Neo4jTemplate.load(type,id,depth)
b) 如果您需要查询多个 id,请在接受一组 org.neo4j.ogm.cypher.Filter
的 org.neo4j.ogm.session.Session
上使用 loadAll
方法。 MusicIntegrationTest
中可用的示例
c) 继续自定义查询,但在您取回实体 ID 后,通过提供自定义深度的 load*
方法加载它。
我的存储库中有一个带注释的查找器方法:
@Query("MATCH (me:User)<-[ab:ASKED_BY]-(q:Question) WHERE id(me) = {0} RETURN q")
Iterable<Question> findQuestionsByUserId(Long id);
我喜欢的对象:
@NodeEntity
public class Question {
private AskedBy askedBy;
@Relationship(type = "TAGGED_WITH")
private Set<Tag> tags = new HashSet<>();
//...
}
@RelationshipEntity(type = "ASKED_BY")
public class AskedBy {
@GraphId private Long id;
@StartNode
private User user;
@EndNode
private Question question;
// other props
}
当我调用存储库方法时,askedBy
字段在结果中是 null
。如何用关系填充该字段?
更新:
我尝试使用会话 loadAll(collection) 加载关系,但没有帮助。
final Collection<Question> questions = (Collection<Question>) questionRepository.findQuestionsByUserId(user.getId());
final Question q = questions.iterator().next();
System.out.println("After `findQuestionsByUserId`:");
System.out.println("`q.getTags().size()`: " + q.getTags().size());
System.out.println("`q.getAskedBy()`: " + q.getAskedBy());
neo4jOperations.loadAll(questions, 1);
System.out.println("After `neo4jOperations.loadAll(questions, 1)`:");
System.out.println("`q.getTags().size()`: " + q.getTags().size());
System.out.println("`q.getAskedBy()`: " + q.getAskedBy());
final Collection<AskedBy> askedByCollection = neo4jOperations.loadAll(AskedBy.class);
System.out.println("`askedByCollection.size()`: " + askedByCollection.size());
上面的代码片段输出
findQuestionsByUserId
之后:
q.getTags().size()
: 0
q.getAskedBy()
: 空
neo4jOperations.loadAll(questions, 1)
之后:
q.getTags().size()
: 1
q.getAskedBy()
: 空
askedByCollection.size()
: 0
自定义查询的默认深度似乎为 0,由于某些未知原因我无法加载关系实体。
图表看起来不错:
目前,自定义查询不支持深度参数(在路线图上),因此您有以下选择-
a) 使用 repository.findOne(userId)
(默认深度为 1,因此它应该加载 AskedBy
)。或者使用 repository.findOne(userId,depth)
自定义深度。或者使用 Neo4jTemplate.load(type,id,depth)
b) 如果您需要查询多个 id,请在接受一组 org.neo4j.ogm.cypher.Filter
的 org.neo4j.ogm.session.Session
上使用 loadAll
方法。 MusicIntegrationTest
c) 继续自定义查询,但在您取回实体 ID 后,通过提供自定义深度的 load*
方法加载它。