[英]Neo4J IN operator
我在使用嵌入式Java API的Cypher查詢中使用IN運算符時遇到問題。 您似乎無法使用IN運算符,其標識符不是在start
子句中檢索的實體。
例如,這是我的查詢:
start n=node(someLongNodeId)
match n--m
where m.gnid? IN [\"someStringId\",\"otherStringId\"]
return m
我可以在對n
的屬性進行過濾時使用IN運算符,但是當我執行上述查詢並嘗試在從columnAs("m")
返回的Iterator
上調用hasNext()
時,它會失敗並出現以下異常:
Exception in thread "main" java.lang.RuntimeException
at org.neo4j.cypher.internal.pipes.matching.MiniMap.newWith(ExpanderStep.scala:172)
at org.neo4j.cypher.internal.pipes.matching.MiniMap.newWith(ExpanderStep.scala:155)
at org.neo4j.cypher.internal.commands.InCollection$$anonfun$isMatch$1.apply(InCollection.scala:39)
at org.neo4j.cypher.internal.commands.InCollection$$anonfun$isMatch$1.apply(InCollection.scala:38)
at scala.collection.LinearSeqOptimized$class.exists(LinearSeqOptimized.scala:79)
at scala.collection.immutable.List.exists(List.scala:45)
at org.neo4j.cypher.internal.commands.AnyInCollection$$anonfun$seqMethod$2.apply(InCollection.scala:71)
at org.neo4j.cypher.internal.commands.AnyInCollection$$anonfun$seqMethod$2.apply(InCollection.scala:71)
at org.neo4j.cypher.internal.commands.InCollection.isMatch(InCollection.scala:38)
at org.neo4j.cypher.internal.commands.And.isMatch(Predicate.scala:83)
at org.neo4j.cypher.internal.pipes.matching.FilteringIterable$FilteringIterator.spoolToNextInLine(FilteringIterable.scala:55)
at org.neo4j.cypher.internal.pipes.matching.FilteringIterable$FilteringIterator.<init>(FilteringIterable.scala:34)
at org.neo4j.cypher.internal.pipes.matching.FilteringIterable.iterator(FilteringIterable.scala:72)
at org.neo4j.cypher.internal.pipes.matching.FilteringIterable.iterator(FilteringIterable.scala:27)
at scala.collection.JavaConversions$IterableWrapperTrait$class.iterator(JavaConversions.scala:557)
at scala.collection.JavaConversions$IterableWrapper.iterator(JavaConversions.scala:583)
at scala.collection.JavaConversions$IterableWrapper.iterator(JavaConversions.scala:583)
at org.neo4j.kernel.impl.traversal.TraversalBranchWithState.expandRelationshipsWithoutChecks(TraversalBranchWithState.java:70)
at org.neo4j.kernel.impl.traversal.TraversalBranchImpl.expandRelationships(TraversalBranchImpl.java:104)
at org.neo4j.kernel.impl.traversal.StartNodeTraversalBranch.next(StartNodeTraversalBranch.java:47)
at org.neo4j.kernel.impl.traversal.AsOneStartBranch.next(AsOneStartBranch.java:100)
at org.neo4j.kernel.PreorderDepthFirstSelector.next(PreorderDepthFirstSelector.java:52)
at org.neo4j.kernel.impl.traversal.TraverserIterator.fetchNextOrNull(TraverserIterator.java:65)
at org.neo4j.kernel.impl.traversal.TraverserIterator.fetchNextOrNull(TraverserIterator.java:34)
at org.neo4j.helpers.collection.PrefetchingIterator.hasNext(PrefetchingIterator.java:55)
at scala.collection.JavaConversions$JIteratorWrapper.hasNext(JavaConversions.scala:574)
at scala.collection.Iterator$$anon$21.hasNext(Iterator.scala:371)
at scala.collection.Iterator$$anon$21.hasNext(Iterator.scala:371)
at scala.collection.Iterator$$anon$22.hasNext(Iterator.scala:388)
at scala.collection.Iterator$$anon$19.hasNext(Iterator.scala:334)
at scala.collection.Iterator$$anon$19.hasNext(Iterator.scala:334)
at org.neo4j.cypher.PipeExecutionResult.hasNext(PipeExecutionResult.scala:138)
at scala.collection.Iterator$$anon$19.hasNext(Iterator.scala:334)
at scala.collection.Iterator$$anon$19.hasNext(Iterator.scala:334)
at scala.collection.JavaConversions$IteratorWrapper.hasNext(JavaConversions.scala:562)
at com.awesomecompany.data.neo.NeoTestDriver.performBidirectionalQuery(NeoTestDriver.java:122)
at com.awesomecompany.data.neo.NeoTestDriver.main(NeoTestDriver.java:44)
我是否正確地假設您不能在我的示例中使用除n
其他內容的IN運算符? 這是一個錯誤,還是這個設計?
我想回答我自己的問題,以防其他人遇到類似的問題。 在參考上面的例子時,我想談談幾件事:
在neo4j Google Group論壇中進行此討論
'
)而不是之前的雙引號 所以我的新示例查詢如下所示:
start n=node(someLongNodeId)
match n--m
where HAS(m.gnid) AND m.gnid IN ['someStringId','otherStringId']
return m
這按預期工作。
在進行了上述編輯之后,我將查詢轉換為使用參數(如果JDBC教會了我什么,那么執行這樣的查詢的正確方法)。 該查詢看起來像這樣:
start n=node({nodeId})
match n--m
where HAS(m.gnid) AND m.gnid IN {otherIds}
return m
這也正常。
IN操作員目前還沒有很好的文檔記錄,這是可以理解的,因為它對neo4j項目來說還是比較新的,但是我想確保在其他人遇到類似問題的情況下回答這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.