1

我在我的項目中使用Spring Data Neo4j,並遇到存儲庫命名約定的問題。Spring存儲庫方法抱怨字段未找到

這是僅包含一個字段和getter/setter方法的簡單類

@RelationshipEntity 
public class ScoredRelationship 
{ 
    protected Float score; 
} 

和下面的類與其它種類的字段

@RelationshipEntity(
    type = RecommenderRelTypes.GOV_CONSUMER_TO_GOV_CONSUMER_SIMILARITY) 
public class GovConsumerToGovConsumerSimilarity extends ScoredRelationship 
{ // Other fields} 

的延伸它要訪問的關係,I」 m使用通常的存儲庫類

public interface GovConsumerToGovConsumerSimilarityRepository extends 
    GraphRepository<GovConsumerToGovConsumerSimilarity> 
{ 

    public Set<GovConsumerToGovConsumerSimilarity> findByScoreGreaterThan(Float value); 

    public Set<GovConsumerToGovConsumerSimilarity> 
    findByScoreGreaterThanOrderByScoreDesc(Float value); 

    public Set<GovConsumerToGovConsumerSimilarity> 
    findTopXByScoreGreaterThanOrderByScoreDesc(int limit, Float score); 
} 

此代碼編譯良好。但是,無論何時我試圖使用其中一種方法,Spring都會返回一系列異常,或者不會按預期行事。

F.e. #findByScoreGreaterThan(0.3f)總是返回一個空集。但是,調用findAll()並打印所有分數時,實際上有很多分數大於0.3的對象。

在第二和第三種情況下,它總是會拋出一個異常說

Caused by: Unknown identifier `score`. 
    at org.neo4j.cypher.internal.symbols.SymbolTable.evaluateType(SymbolTable.scala:60) 
    at org.neo4j.cypher.internal.commands.expressions.Identifier.evaluateType(Identifier.scala:51) 
    at org.neo4j.cypher.internal.commands.expressions.Expression.assertTypes(Expression.scala:53) 
    at org.neo4j.cypher.internal.pipes.SortPipe$$anonfun$assertTypes$1.apply(SortPipe.scala:34) 
    at org.neo4j.cypher.internal.pipes.SortPipe$$anonfun$assertTypes$1.apply(SortPipe.scala:33) 
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59) 
    at scala.collection.immutable.List.foreach(List.scala:45) 
    at org.neo4j.cypher.internal.pipes.SortPipe.assertTypes(SortPipe.scala:33) 
    at org.neo4j.cypher.internal.pipes.PipeWithSource.<init>(PipeWithSource.scala:27) 
    at org.neo4j.cypher.internal.pipes.SortPipe.<init>(SortPipe.scala:29) 
    at org.neo4j.cypher.internal.executionplan.builders.SortBuilder.apply(SortBuilder.scala:33) 
    at org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl.prepareExecutionPlan(ExecutionPlanImpl.scala:49) 
    at org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl.<init>(ExecutionPlanImpl.scala:33) 
    at org.neo4j.cypher.ExecutionEngine$$anonfun$prepare$1.apply(ExecutionEngine.scala:67) 
    at org.neo4j.cypher.ExecutionEngine$$anonfun$prepare$1.apply(ExecutionEngine.scala:67) 
    at org.neo4j.cypher.internal.LRUCache.getOrElseUpdate(LRUCache.scala:37) 
    at org.neo4j.cypher.ExecutionEngine.prepare(ExecutionEngine.scala:67) 
    at org.neo4j.cypher.ExecutionEngine.execute(ExecutionEngine.scala:59) 
    at org.neo4j.cypher.ExecutionEngine.execute(ExecutionEngine.scala:63) 
    at org.neo4j.cypher.javacompat.ExecutionEngine.execute(ExecutionEngine.java:79) 
    at org.springframework.data.neo4j.support.query.CypherQueryEngine.parseAndExecuteQuery(CypherQueryEngine.java:61) 

怎麼可能呢?我的意思是,這個班級顯然有score字段。此外,執行簡單的#findByScoreGreaterThan(float value)不會引發任何異常,但同樣,後一種方法總是返回一個空集。編輯: 這些是春季使用的查詢。其實,他們似乎是正確

Executing cypher query: START `govConsumerToGovConsumerSimilarity`=node:__types__(className="it.cerict.recommender.persistence.neo4j.GovConsumerToGovConsumerSimilarity") WHERE `govConsumerToGovConsumerSimilarity`.`score`! > {0} RETURN `govConsumerToGovConsumerSimilarity` params {0=0.3} 

Executing cypher query: START `govConsumerToGovConsumerSimilarity`=node:__types__(className="it.cerict.recommender.persistence.neo4j.GovConsumerToGovConsumerSimilarity") WHERE `govConsumerToGovConsumerSimilarity`.`score`! > {0} RETURN `govConsumerToGovConsumerSimilarity` ORDER BY score DESC params {0=0.3} 

EDIT2:我也試圖從Floatscore類型沒有進一步的改進改爲float

+0

嘗試#findByScoreGreaterThanOrderByScoreDesc()方法 - ByOrderBy - 公共集 findByScoreGreaterThanByOrderByScoreDesc(浮點型值); – farrellmr

+0

@farrellmr這會在編譯時返回錯誤,說'無效的派生查詢!沒有找到類型爲Float的屬性greaterThanBy!遍歷的路徑:GovConsumerToGovConsumerSimilarity.score.' – tigerjack89

+0

@farrellmr也看看我的編輯,因爲第一種方法也沒有按預期行事。 – tigerjack89

回答

1

這似乎是與Spring Data Neo4j有關的錯誤。查看執行的查詢,顯然它搜索節點,而它應該搜索關係。

我改變使用@Query批註,用於指定以下Cypher查詢

START `govConsumerToGovConsumerSimilarity`=rel:__rel_types__(className="it.cerict.recommender.persistence.neo4j.GovConsumerToGovConsumerSimilarity") WHERE `govConsumerToGovConsumerSimilarity`.`score`! > 0.3 RETURN `govConsumerToGovConsumerSimilarity` ORDER BY `govConsumerToGovConsumerSimilarity`.`score` DESC;