Java Neo4J IN算子

Java Neo4J IN算子,java,neo4j,Java,Neo4j,我在使用嵌入式JavaAPI在密码查询中使用IN运算符时遇到问题。除了在start子句中检索到的实体之外,您似乎无法使用具有标识符的IN运算符 例如,以下是我的查询: start n=node(someLongNodeId) match n--m where m.gnid? IN [\"someStringId\",\"otherStringId\"] return m 在对n的属性进行过滤时,我可以使用IN运算符,但当我执行上述查询并尝试调用从columnAs(“m”)返回的迭代器上的

我在使用嵌入式JavaAPI在密码查询中使用IN运算符时遇到问题。除了在
start
子句中检索到的实体之外,您似乎无法使用具有标识符的IN运算符

例如,以下是我的查询:

start n=node(someLongNodeId) 
match n--m 
where m.gnid? IN [\"someStringId\",\"otherStringId\"] 
return m
在对
n
的属性进行过滤时,我可以使用IN运算符,但当我执行上述查询并尝试调用从
columnAs(“m”)
返回的
迭代器上的
hasNext()
时,它会失败,出现以下异常:

线程“main”java.lang.RuntimeException中的异常 位于org.neo4j.cypher.internal.pipes.matching.MiniMap.newWith(ExpanderStep.scala:172) 位于org.neo4j.cypher.internal.pipes.matching.MiniMap.newWith(ExpanderStep.scala:155) 位于org.neo4j.cypher.internal.commands.InCollection$$anonfun$isMatch$1.apply(InCollection.scala:39) 位于org.neo4j.cypher.internal.commands.InCollection$$anonfun$isMatch$1.apply(InCollection.scala:38) 位于scala.collection.LinearSeqOptimized$class.exists(LinearSeqOptimized.scala:79) 位于scala.collection.immutable.List.exists(List.scala:45) 位于org.neo4j.cypher.internal.commands.AnyInCollection$$anonfun$seqMethod$2.apply(InCollection.scala:71) 位于org.neo4j.cypher.internal.commands.AnyInCollection$$anonfun$seqMethod$2.apply(InCollection.scala:71) 位于org.neo4j.cypher.internal.commands.InCollection.isMatch(InCollection.scala:38) 位于org.neo4j.cypher.internal.commands.And.isMatch(Predicate.scala:83) 在org.neo4j.cypher.internal.pipes.matching.filterigitalable$filterigiterator.spooltonline上(filterigitalable.scala:55) 在org.neo4j.cypher.internal.pipes.matching.FilterIngitable$FilterIngitable.scala:34上 在org.neo4j.cypher.internal.pipes.matching.filterigitable.iterator(filterigitable.scala:72)上 在org.neo4j.cypher.internal.pipes.matching.filteriniterable.iterator(filteriniterable.scala:27)上 位于scala.collection.JavaConversions$iterablerrappertrait$class.iterator(JavaConversions.scala:557) 位于scala.collection.JavaConversions$iterablerrapper.iterator(JavaConversions.scala:583) 位于scala.collection.JavaConversions$iterablerrapper.iterator(JavaConversions.scala:583) 位于org.neo4j.kernel.impl.traversal.TraversalBranchWithState.expandRelationshipsWithoutChecks(TraversalBranchWithState.java:70) 位于org.neo4j.kernel.impl.traversal.TraversalBranchImpl.expandRelationships(TraversalBranchImpl.java:104) 位于org.neo4j.kernel.impl.traversal.StartNodeTraversalBranch.next(StartNodeTraversalBranch.java:47) 位于org.neo4j.kernel.impl.traversal.AsOneStartBranch.next(AsOneStartBranch.java:100) 位于org.neo4j.kernel.preorderpthfirstselector.next(preorderpthfirstselector.java:52) 位于org.neo4j.kernel.impl.traversal.traverserierator.fetchNextOrNull(traverserierator.java:65) 位于org.neo4j.kernel.impl.traversal.traverserierator.fetchNextOrNull(traverserierator.java:34) 位于org.neo4j.helpers.collection.PrefetchingIterator.hasNext(PrefetchingIterator.java:55) 位于scala.collection.JavaConversions$JIteratorWrapper.hasNext(JavaConversions.scala:574) 位于scala.collection.Iterator$$anon$21.hasNext(Iterator.scala:371) 位于scala.collection.Iterator$$anon$21.hasNext(Iterator.scala:371) 在scala.collection.Iterator$$anon$22.hasNext(Iterator.scala:388) 位于scala.collection.Iterator$$anon$19.hasNext(Iterator.scala:334) 位于scala.collection.Iterator$$anon$19.hasNext(Iterator.scala:334) 位于org.neo4j.cypher.PipeExecutionResult.hasNext(PipeExecutionResult.scala:138) 位于scala.collection.Iterator$$anon$19.hasNext(Iterator.scala:334) 位于scala.collection.Iterator$$anon$19.hasNext(Iterator.scala:334) 位于scala.collection.JavaConversions$IteratorWrapper.hasNext(JavaConversions.scala:562) 位于com.awesomecompany.data.neo.NeoTestDriver.performBidirectionalQuery(NeoTestDriver.java:122) 位于com.awesomecompany.data.neo.NeoTestDriver.main(NeoTestDriver.java:44)

我的假设正确吗?在我的示例中,除了
n
之外,您不能在其他对象上使用in运算符?这是一个bug,还是设计的?

我想回答我自己的问题,以防其他人也有类似的问题。关于上面的例子,我想谈几件事:

neo4j谷歌集团论坛上的Per

  • 我在WHERE子句中添加了HAS()函数
  • 我还将数组值更改为使用单引号(
    ),而不是以前的双引号
因此,我的新示例查询如下所示:

start n=node(someLongNodeId) 
match n--m 
where HAS(m.gnid) AND m.gnid IN ['someStringId','otherStringId'] 
return m
start n=node({nodeId}) 
match n--m 
where HAS(m.gnid) AND m.gnid IN {otherIds}
return m
这一切如期而至

在进行了上述编辑之后,我将查询转换为使用参数(如果JDBC教过我什么的话,这是执行类似查询的正确方法)。该查询如下所示:

start n=node(someLongNodeId) 
match n--m 
where HAS(m.gnid) AND m.gnid IN ['someStringId','otherStringId'] 
return m
start n=node({nodeId}) 
match n--m 
where HAS(m.gnid) AND m.gnid IN {otherIds}
return m
这也起到了正确的作用


IN操作符目前没有很好的文档记录,这是可以理解的,因为它对neo4j项目来说是相当新的,但我想确保这一点得到了回答,以防其他人遇到类似的问题。

一个小样本数据库在没有
HAS()的情况下工作。
:您是正确的,但仅当您在start子句中使用
*
运算符时。请使用特定的节点id重试。根据论坛讨论,再做一个说明。如果您想使用neo4j生成的ID来实现这一点,而不是使用HAS函数,那么您的where子句需要看起来像
where NOT(ID(m)为NULL)和{ids}中的ID(m)
如果这是neo4j 1.8.1,那么HAS只是一个解决方法-这是一个已知问题,应该在下一个里程碑中解决,这是一个问题,HAS()这是一个解决办法。仅当您的查询中有
匹配项
中时,才会发生此错误,对此给您带来的不便深表歉意。