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

Neo4j Cypher 1.9.9,从关系和节点索引开始,neo4j,cypher,spring-data-neo4j,Neo4j,Cypher,Spring Data Neo4j,我的Neo4j 1.9.9实体使用Spring数据Neo4j存储。然而,由于许多原因,我不得不直接使用Cypher 基本上,我有两门课: @NodeEntity public class RecommenderMashup { @Indexed(indexType = IndexType.SIMPLE, indexName = "recommenderMashupIds") private String mashupId; } @RelationshipEntity(typ

我的
Neo4j 1.9.9
实体使用
Spring数据Neo4j
存储。然而,由于许多原因,我不得不直接使用
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
还添加了两个其他索引:
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>用于节点,而
用于关系;它们都有
className
作为键

因此,我尝试了下面的查询,以获取与特定节点相关的所有
mashupMashupSimilarity
对象

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 `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`;
您使用
mashupMashupSimilarity
作为关系的标识符

  • 但是,您错误地将其用作关系类型:
    -[:mashupMashupSimilarity]->
  • 它应该是:
    -[mashupMashupSimilarity]->
  • 当然,最好跳过rel索引检查,使用
    -[similarity:MASHUP\u TO\u MASHUP\u similarity]->
您可以离开关系索引查找,这根本没有意义,因为您应该已经使用关系类型进行筛选

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

嘿,Michael,是的,我确实使用了所有可用的方法和各种查询,但它们都给出了错误的结果。关于
,我试图不使用它们,但结果是我得到了
\uuuu type\uuu='package.mashupMashupSimilarity'
的所有关系;i、 例如,根本不考虑
mashupFrom
mashupTo
节点。这是正常的行为吗?让我使用标识符作为关系类型的另一个原因是,即使
Spring数据Neo4j
也使用类似的东西(尽管派生查询被错误地放在一起)。那么,建议的方法是后一种方法吗?我根本不会使用索引进行类型检查。我更新了我的答案。
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 mashupFrom=node:recommenderMashupIds(mashupId='5367575248633856')
MATCH (mashupFrom)-[mashupToMashupSimilarity:MASHUP_TO_MASHUP_SIMILARITY]->(mashupTo) 
WHERE mashupTo.__type__ = 'package.RecommenderMashup'
RETURN mashupToMashupSimilarity;