2013-12-18 29 views
0

中使用索引查找我有一個Spring Data Neo4j項目(版本2.3.2.RELEASE),其中有一個BesoinNode實體樹。該BesoinNode包含一個「名稱」字段和一組子:使用@Query在START

@NodeEntity 
public class BesoinNode implements Besoin { 

    @GraphId private Long id; 

    //@Indexed(indexName = "indexBesoin", indexType = FULLTEXT) private String name; 
    @Indexed(indexName = "indexBesoin") private String name; 

    @RelatedTo(elementClass = BesoinNode.class, type = "hasChild", direction = OUTGOING) 
    private Set<Besoin> besoins = new HashSet<Besoin>(); 

    // etc. 
} 

相關的資料庫是:

public interface BesoinRepository extends GraphRepository<BesoinNode>, RelationshipOperationsRepository<BesoinNode>, NamedIndexRepository<BesoinNode> { 

    // This query works 
    @Query(value = "start parent=node({0}) match (parent)-[:hasChild]->(child) return child") 
    Set<BesoinNode> findChildrenOf(Long id); 

    // This query doesn't work 
    @Query(value = "start parent=node:indexBesoin({name}) match (parent)-[:hasChild]->(child) return child") 
    Set<BesoinNode> findChildrenOf(@Param("name") String name); 

} 

第一個查詢工作,但調用它,我首先需要獲取ID節點,這是不必要的,我想避免的東西。這就是第二個查詢應該做的事情,但我無法使其工作。什麼可能是錯的?

如果我調用findChildrenOf("What a great name for a BesoinNode")方法,我得到一個空指針異常。堆棧跟蹤是:

java.lang.NullPointerException 
    at org.apache.lucene.util.SimpleStringInterner.intern(SimpleStringInterner.java:54) 
    at org.apache.lucene.util.StringHelper.intern(StringHelper.java:39) 
    at org.apache.lucene.index.Term.<init>(Term.java:38) 
    at org.apache.lucene.queryParser.QueryParser.getFieldQuery(QueryParser.java:643) 
    at org.apache.lucene.queryParser.QueryParser.Term(QueryParser.java:1436) 
    at org.apache.lucene.queryParser.QueryParser.Clause(QueryParser.java:1319) 
    at org.apache.lucene.queryParser.QueryParser.Query(QueryParser.java:1245) 
    at org.apache.lucene.queryParser.QueryParser.TopLevelQuery(QueryParser.java:1234) 
    at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:206) 
    at org.neo4j.index.impl.lucene.IndexType.query(IndexType.java:300) 
    at org.neo4j.index.impl.lucene.LuceneIndex.query(LuceneIndex.java:227) 
    at org.neo4j.index.impl.lucene.LuceneIndex.query(LuceneIndex.java:238) 
    at org.neo4j.cypher.internal.spi.gdsimpl.GDSBackedQueryContext$$anon$1.indexQuery(GDSBackedQueryContext.scala:87) 
    at org.neo4j.cypher.internal.executionplan.builders.IndexQueryBuilder$$anonfun$getNodeGetter$2.apply(IndexQueryBuilder.scala:83) 
    at org.neo4j.cypher.internal.executionplan.builders.IndexQueryBuilder$$anonfun$getNodeGetter$2.apply(IndexQueryBuilder.scala:81) 
    at org.neo4j.cypher.internal.pipes.matching.MonoDirectionalTraversalMatcher.findMatchingPaths(MonodirectionalTraversalMatcher.scala:45) 
    at org.neo4j.cypher.internal.pipes.TraversalMatchPipe$$anonfun$internalCreateResults$1.apply(TraversalMatchPipe.scala:38) 
    at org.neo4j.cypher.internal.pipes.TraversalMatchPipe$$anonfun$internalCreateResults$1.apply(TraversalMatchPipe.scala:35) 
    at scala.collection.Iterator$$anon$13.hasNext(Iterator.scala:371) 
    at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:327) 
    at org.neo4j.cypher.internal.ClosingIterator$$anonfun$hasNext$1.apply$mcZ$sp(ClosingIterator.scala:36) 
    at org.neo4j.cypher.internal.ClosingIterator$$anonfun$hasNext$1.apply(ClosingIterator.scala:35) 
    at org.neo4j.cypher.internal.ClosingIterator$$anonfun$hasNext$1.apply(ClosingIterator.scala:35) 
    at org.neo4j.cypher.internal.ClosingIterator.failIfThrows(ClosingIterator.scala:86) 
    at org.neo4j.cypher.internal.ClosingIterator.hasNext(ClosingIterator.scala:35) 
    at org.neo4j.cypher.PipeExecutionResult.hasNext(PipeExecutionResult.scala:157) 
    at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:327) 
    at scala.collection.convert.Wrappers$IteratorWrapper.hasNext(Wrappers.scala:29) 
    at org.neo4j.cypher.PipeExecutionResult$$anon$1.hasNext(PipeExecutionResult.scala:73) 
    at org.neo4j.helpers.collection.IteratorWrapper.hasNext(IteratorWrapper.java:42) 
    at org.neo4j.helpers.collection.IteratorUtil.addToCollection(IteratorUtil.java:351) 
    at org.neo4j.helpers.collection.IteratorUtil.addToCollection(IteratorUtil.java:370) 
    at org.springframework.data.neo4j.repository.query.GraphRepositoryQuery.dispatchQuery(GraphRepositoryQuery.java:104) 
    at org.springframework.data.neo4j.repository.query.GraphRepositoryQuery.execute(GraphRepositoryQuery.java:81) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:323) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
    at com.sun.proxy.$Proxy29.findChildrenOf(Unknown Source) 

任何幫助將不勝感激,因爲我正在與這個問題兩天的戰鬥。

回答

1

好的,它突然發揮作用,問題是我混合了兩種樣式的索引查找。

我需要爲Lucene指定「名稱」。因此,而不是:

// This query doesn't work 
@Query(value = "start parent=node:indexBesoin({name}) match (parent)-[:hasChild]->(child) return child") 
Set<BesoinNode> findChildrenOf(@Param("name") String name); 

我需要:

// This query works 
@Query(value = "start parent=node:indexBesoin(name={name}) match (parent)-[:hasChild]->(child) return child") 
Set<BesoinNode> findChildrenOf(@Param("name") String name); 

的區別是 「indexBesoin(名稱= {}名)」,而不只是 「indexBesoin({}名)」。

似乎在Spring Data Neo4j中有不同的方式來使用索引,這很令人困惑。

+0

這不是Spring數據neo4j的問題,它是Neo4j/Cypher如何暴露索引的問題,您可以這樣做:'start n = node:index(「key:value」)'這是一個索引查詢併發送到索引,或'開始N =節點:索引(鍵= {值})'精確查找 –

+0

@MichaelHunger Humm,在第一種語法(「鍵:值」),是否可以用'value '帶一個參數(例如'{name}')?在我的示例中,如何在不對雙引號產生任何問題的情況下使用'index(「name:name」)'? –