Cypher 1.9.9,由关系和节点索引开始

时间:2015-07-05 12:16:55

标签: neo4j cypher spring-data-neo4j

我的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`;

我不知道它在性能方面是如何工作的(索引应该更快)。而且,我很好奇我做错了什么。

1 个答案:

答案 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]->
  • 但当然更好,跳过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;

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