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)
任何幫助將不勝感激,因爲我正在與這個問題兩天的戰鬥。
這不是Spring數據neo4j的問題,它是Neo4j/Cypher如何暴露索引的問題,您可以這樣做:'start n = node:index(「key:value」)'這是一個索引查詢併發送到索引,或'開始N =節點:索引(鍵= {值})'精確查找 –
@MichaelHunger Humm,在第一種語法(「鍵:值」),是否可以用'value '帶一個參數(例如'{name}')?在我的示例中,如何在不對雙引號產生任何問題的情況下使用'index(「name:name」)'? –