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;

由于关系类型已经受到限制,我认为您甚至不需要对目标节点进行类型检查。