我的Neo4j 1.9.9
个实体使用Spring Data Neo4j
存储。但是,由于很多derived queries from repository methods are wrong,我被迫直接使用Cypher
基本上,我有两个班级:
@NodeEntity
public class RecommenderMashup {
@Indexed(indexType = IndexType.SIMPLE, indexName = "recommenderMashupIds")
private String mashupId;
}
@RelationshipEntity(type = "MASHUP_TO_MASHUP_SIMILARITY")
public class MashupToMashupSimilarity {
@StartNode
private RecommenderMashup mashupFrom;
@EndNode
private RecommenderMashup mashupTo;
}
除了直接提供的索引之外,如您所知,Spring Data Neo4j
还添加了两个其他索引:节点__types__
和关系__rel_types__
;他们都以className
为关键。
所以,我尝试了下面的查询来获取与特定节点相关的所有MashupToMashupSimilarity
个对象
START `mashupFrom`=node:`recommenderMashupIds`(`mashupId`='5367575248633856'),
`mashupTo`=node:__types__(className="package.RecommenderMashup"),
`mashupToMashupSimilarity`=rel:__rel_types__(className="package.MashupToMashupSimilarity")
MATCH `mashupFrom`-[:`mashupToMashupSimilarity`]->`mashupTo`
RETURN `mashupToMashupSimilarity`;
然而,我总是得到空洞的结果。我怀疑这是因为START
子句包含节点和关系。这可能吗?否则,这可能是什么问题?
犯罪嫌疑人来自
START `mashupToMashupSimilarity`=rel:__rel_types__(className='package.MashupToMashupSimilarity')
RETURN `mashupToMashupSimilarity`;
和
START `mashup`=node:__types__(className="package.RecommenderMashup")
RETURN `mashup`;
和其他类似的查询总是返回正确的结果。 此时唯一可行的替代方案是
START `mashupFrom`=node:`recommenderMashupIds`(`mashupId`='6006582764634112'),
`mashupTo`=node:__types__(className="package.RecommenderMashup")
MATCH `mashupFrom`-[`similarity`:MASHUP_TO_MASHUP_SIMILARITY]->`mashupTo`
RETURN `similarity`;
我不知道它在性能方面是如何工作的(索引应该更快)。而且,我很好奇我做错了什么。
答案 0 :(得分:1)
您是否尝试在neo4j-browser或shell中运行查询?他们在那里工作了吗?
此查询也有误,
START `mashupFrom`=node:`recommenderMashupIds`(`mashupId`='5367575248633856'),
`mashupTo`=node:__types__(className="package.RecommenderMashup"),
`mashupToMashupSimilarity`=rel:__rel_types__(className="package.MashupToMashupSimilarity")
MATCH `mashupFrom`-[:`mashupToMashupSimilarity`]->`mashupTo`
RETURN `mashupToMashupSimilarity`;
您使用mashupToMashupSimilarity
作为关系的标识符,
-[:mashupToMashupSimilarity]->
-[mashupToMashupSimilarity]->
-[similarity:MASHUP_TO_MASHUP_SIMILARITY]->
你可以离开关系索引查找根本没有意义,因为你应该已经用关系类型进行过滤。
START mashupFrom=node:recommenderMashupIds(mashupId='5367575248633856')
MATCH (mashupFrom)-[mashupToMashupSimilarity:MASHUP_TO_MASHUP_SIMILARITY]->(mashupTo)
WHERE mashupTo.__type__ = 'package.RecommenderMashup'
RETURN mashupToMashupSimilarity;
由于关系类型已经受到限制,我认为您甚至不需要对目标节点进行类型检查。