Cypher 1.9.9,通过关系和节点索引启动
Cypher 1.9.9, START by both relationship and node index
我的 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`;
和其他类似的查询总是 return 正确的结果。
此时唯一可行的选择是
START `mashupFrom`=node:`recommenderMashupIds`(`mashupId`='6006582764634112'),
`mashupTo`=node:__types__(className="package.RecommenderMashup")
MATCH `mashupFrom`-[`similarity`:MASHUP_TO_MASHUP_SIMILARITY]->`mashupTo`
RETURN `similarity`;
我都不知道它在性能方面是如何工作的(索引应该更快)。另外,我很好奇我做错了什么。
您是否尝试 运行 在 neo4j 浏览器或 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]->
- 但当然更好,跳过 rel-index 检查并使用
-[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;
由于关系类型已经受到限制,我认为您甚至不需要对目标节点进行类型检查。
我的 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`;
和其他类似的查询总是 return 正确的结果。 此时唯一可行的选择是
START `mashupFrom`=node:`recommenderMashupIds`(`mashupId`='6006582764634112'),
`mashupTo`=node:__types__(className="package.RecommenderMashup")
MATCH `mashupFrom`-[`similarity`:MASHUP_TO_MASHUP_SIMILARITY]->`mashupTo`
RETURN `similarity`;
我都不知道它在性能方面是如何工作的(索引应该更快)。另外,我很好奇我做错了什么。
您是否尝试 运行 在 neo4j 浏览器或 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]->
- 但当然更好,跳过 rel-index 检查并使用
-[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;
由于关系类型已经受到限制,我认为您甚至不需要对目标节点进行类型检查。