【问题标题】:Cypher 1.9.9, START by both relationship and node indexCypher 1.9.9,通过关系和节点索引开始
【发布时间】:2015-07-05 12:16:55
【问题描述】:

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

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

【问题讨论】:

    标签: neo4j cypher spring-data-neo4j


    【解决方案1】:

    您是否尝试在 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;
    

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

    【讨论】:

    • 嘿迈克尔,是的,我确实使用了所有可用的方法和各种查询,但它们都给出了错误的结果。关于:,我尝试不使用它们,但结果我得到了__type__ = 'package.MashupToMashupSimilarity' 的所有关系;即,根本不考虑mashupFrommashupTo 节点。这是正常的行为吗?使我使用标识符作为关系类型的另一个原因是,即使Spring Data Neo4j 使用类似的东西(尽管派生查询被错误地放在一起)。那么,后一种方法是建议的方法吗?
    • 我根本不会使用索引进行类型检查。我更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-22
    相关资源
    最近更新 更多