【问题标题】:Overcoming NullPointerException on Cypher Lucene query克服 Cypher Lucene 查询中的 NullPointerException
【发布时间】:2014-03-25 14:41:41
【问题描述】:

我正在尝试在 neo4j 2.0.1 数据库中使用 lucene 索引来对节点的 name 属性中的特定术语进行模糊查询。执行这些查询时,虽然 lucene 语法看起来不错,但它会失败并返回一个神秘的 NullPointerException。可能是我在 lucene 语法中犯了一些直截了当的错误,但我怎样才能发现那是什么?

字符串查询 = "开始 n=node:node_auto_index({searchCriteria}) "+ “匹配(n:出处)” + "返回 n" + "按 n.created desc 排序" + “限制 10”; 字符串表达式 = 术语; if(term.contains(" ") || term.contains("\t")) expr = "\"" + 术语 + "\""; expr = "'名称:" + expr + "~'"; log.info("搜索表达式=" + expr); Mapparams = new HashMap(); params.put("searchCriteria", expr);

当这个方法使用“track”参数运行时,输出是这样的:

INFO: 搜索表达式='name:track~' java.lang.NullPointerException 在 org.apache.lucene.util.SimpleStringInterner.intern(SimpleStringInterner.java:54) 在 org.apache.lucene.util.StringHelper.intern(StringHelper.java:39) 在 org.apache.lucene.index.Term.(Term.java:38) 在 org.apache.lucene.queryParser.QueryParser.getFieldQuery(QueryParser.java:643) 在 org.apache.lucene.queryParser.QueryParser.Term(QueryParser.java:1436) 在 org.apache.lucene.queryParser.QueryParser.Clause(QueryParser.java:1319) 在 org.apache.lucene.queryParser.QueryParser.Query(QueryParser.java:1275) 在 org.apache.lucene.queryParser.QueryParser.TopLevelQuery(QueryParser.java:1234) 在 org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:206) 在 org.neo4j.index.impl.lucene.IndexType.query(IndexType.java:303) 在 org.neo4j.index.impl.lucene.LuceneIndex.query(LuceneIndex.java:251) 在 org.neo4j.index.impl.lucene.LuceneIndex.query(LuceneIndex.java:263) 在 org.neo4j.kernel.impl.coreapi.AbstractAutoIndexerImpl$ReadOnlyIndexToIndexAdapter.query(AbstractAutoIndexerImpl.java:249) 在 org.neo4j.cypher.internal.spi.v2_0.TransactionBoundExecutionContext$NodeOperations.indexQuery(TransactionBoundExecutionContext.scala:166) 在 org.neo4j.cypher.internal.compiler.v2_0.spi.DelegatingOperations.indexQuery(DelegatingQueryContext.scala:113) 在 org.neo4j.cypher.internal.compiler.v2_0.spi.ExceptionTranslatingQueryContext$ExceptionTranslatingOperations.org$neo4j$cypher$internal$compiler$v2_0$spi$ExceptionTranslatingQueryContext$ExceptionTranslatingOperations$$super$indexQuery(ExceptionTranslatingQueryContext.scala:142) 在 org.neo4j.cypher.internal.compiler.v2_0.spi.ExceptionTranslatingQueryContext$ExceptionTranslatingOperations$$anonfun$indexQuery$1.apply(ExceptionTranslatingQueryContext.scala:142) 在 org.neo4j.cypher.internal.compiler.v2_0.spi.ExceptionTranslatingQueryContext$ExceptionTranslatingOperations$$anonfun$indexQuery$1.apply(ExceptionTranslatingQueryContext.scala:142) 在 org.neo4j.cypher.internal.compiler.v2_0.spi.ExceptionTranslatingQueryContext.org$neo4j$cypher$internal$compiler$v2_0$spi$ExceptionTranslatingQueryContext$$translateException(ExceptionTranslatingQueryContext.scala:149) 在 org.neo4j.cypher.internal.compiler.v2_0.spi.ExceptionTranslatingQueryContext$ExceptionTranslatingOperations.indexQuery(ExceptionTranslatingQueryContext.scala:142) 在 org.neo4j.cypher.internal.compiler.v2_0.spi.DelegatingOperations.indexQuery(DelegatingQueryContext.scala:113) 在 org.neo4j.cypher.internal.compiler.v2_0.executionplan.builders.EntityProducerFactory$$anonfun$2$$anonfun$applyOrElse$2.apply(EntityProducerFactory.scala:66) 在 org.neo4j.cypher.internal.compiler.v2_0.executionplan.builders.EntityProducerFactory$$anonfun$2$$anonfun$applyOrElse$2.apply(EntityProducerFactory.scala:64) 在 org.neo4j.cypher.internal.compiler.v2_0.executionplan.builders.EntityProducerFactory$$anon$1.apply(EntityProducerFactory.scala:35) 在 org.neo4j.cypher.internal.compiler.v2_0.executionplan.builders.EntityProducerFactory$$anon$1.apply(EntityProducerFactory.scala:34) 在 org.neo4j.cypher.internal.compiler.v2_0.pipes.StartPipe$$anonfun$internalCreateResults$1.apply(StartPipe.scala:34) 在 org.neo4j.cypher.internal.compiler.v2_0.pipes.StartPipe$$anonfun$internalCreateResults$1.apply(StartPipe.scala:33) 在 scala.collection.Iterator$$anon$13.hasNext(Iterator.scala:371) 在 scala.collection.Iterator$$anon$14.hasNext(Iterator.scala:388) 在 scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:327) 在 scala.collection.Iterator$class.isEmpty(Iterator.scala:256) 在 scala.collection.AbstractIterator.isEmpty(Iterator.scala:1157) 在 org.neo4j.cypher.internal.compiler.v2_0.pipes.TopPipe.internalCreateResults(TopPipe.scala:42) 在 org.neo4j.cypher.internal.compiler.v2_0.pipes.PipeWithSource.createResults(Pipe.scala:71) 在 org.neo4j.cypher.internal.compiler.v2_0.pipes.PipeWithSource.createResults(Pipe.scala:68) 在 org.neo4j.cypher.internal.compiler.v2_0.executionplan.ExecutionPlanBuilder.org$neo4j$cypher$internal$compiler$v2_0$executionplan$ExecutionPlanBuilder$$prepareStateAndResult(ExecutionPlanBuilder.scala:149) 在 org.neo4j.cypher.internal.compiler.v2_0.executionplan.ExecutionPlanBuilder$$anonfun$2.apply(ExecutionPlanBuilder.scala:126) 在 org.neo4j.cypher.internal.compiler.v2_0.executionplan.ExecutionPlanBuilder$$anonfun$2.apply(ExecutionPlanBuilder.scala:125) 在 org.neo4j.cypher.internal.compiler.v2_0.executionplan.ExecutionPlanBuilder$$anon$6.execute(ExecutionPlanBuilder.scala:50) 在 org.neo4j.cypher.internal.ExecutionPlanWrapperForV2_0.execute(CypherCompiler.scala:93) 在 org.neo4j.cypher.ExecutionEngine.execute(ExecutionEngine.scala:61) 在 org.neo4j.cypher.ExecutionEngine.execute(ExecutionEngine.scala:65) 在 org.neo4j.cypher.javacompat.ExecutionEngine.execute(ExecutionEngine.java:78) 在 org.mitre.provenance.db.neo4j.Neo4JStorage.execute(Neo4JStorage.java:1216)

【问题讨论】:

    标签: java lucene neo4j cypher


    【解决方案1】:

    您的 Lucene 语法是正确的。如果您将查询作为参数提供,则必须不使用“'”字符。

    所以用

    expr = "name:" + expr + "~"; 
    

    而不是

    expr = "'name:" + expr + "~'";
    

    您还可以提供如下模糊因子:

    expr = "name:" + expr + "~0.8"; 
    

    【讨论】:

    • 如果 Lucene 查询语法正确,NullPointerException 的解释是什么?
    • 我认为异常消息肯定有改进的余地,但关键是无法处理lucene查询。当您将查询作为参数传递时,我猜 Cypher 已经在查询周围放置了引号,因此您最终会使用双引号,这是错误的。
    猜你喜欢
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 2022-11-26
    • 2014-05-24
    相关资源
    最近更新 更多