gpt4 book ai didi

neo4j - 嵌套 UNWIND - 非列表的选择性行为。这怎么可能?

转载 作者:行者123 更新时间:2023-12-01 12:10:33 24 4
gpt4 key购买 nike

这让我发疯,特别是因为它打破了我对 Neo4j 工作方式的心理模型。

1. 失败:unwind(5)

来自 the manual :

Attempting to use UNWIND on an expression that does not return a list — such as UNWIND 5 — will cause an error.



的确:
WITH 5 AS x 
UNWIND x AS y
RETURN y

产量:
Neo.ClientError.Statement.SyntaxError: Type mismatch: expected List<T> but was Integer (line 2, column 8 (offset: 20))
"UNWIND x AS y "
^

2. 作品:unwind( [ 1, [ 2, 3 ] ] )

作为下一步的准备:
WITH [1, [2,3]] AS x 
UNWIND x AS y
RETURN y

吐:
╒═════╕
│"y" │
╞═════╡
│1 │
├─────┤
│[2,3]│
└─────┘

注意第一行是 1 - 不是 list 。

3. 作品: unwind( unwind( [ 1, [ 2, 3 ] ] ) )

惊喜?
WITH [1, [2,3]] AS x 
UNWIND x AS y
UNWIND y AS z
RETURN z

输出:
╒═══╕
│"z"│
╞═══╡
│1 │
├───┤
│2 │
├───┤
│3 │
└───┘

所以 Neo 对 1 没问题在嵌套的展开。

4. 失败: unwind( unwind( [ 1, 2 ] ) )
WITH [1, 2] AS x 
UNWIND x AS y
UNWIND y AS z
RETURN z

错误:
Neo.ClientError.Statement.SyntaxError: Type mismatch: expected List<T> but was Integer (line 3, column 8 (offset: 40))
"UNWIND y AS z "
^

这怎么可能?

我只是无法理解,在懒惰的上下文中,如果项目不是列表,则展开可以选择性地失败,但只有这么长时间(迭代的)行都不涉及列表。

换句话说,怎么来的 1如果情况 3 可以,但情况 4 不行?

有兴趣者, here's the code for the unwind pipe .没有什么可以说明魔法是如何发生的。
case class UnwindPipe(source: Pipe, collection: Expression, variable: String)
(val id: Id = Id.INVALID_ID)
extends PipeWithSource(source) with ListSupport {

collection.registerOwningPipe(this)

protected def internalCreateResults(input: Iterator[ExecutionContext], state: QueryState): Iterator[ExecutionContext] = {
if (input.hasNext) new UnwindIterator(input, state) else Iterator.empty
}

private class UnwindIterator(input: Iterator[ExecutionContext], state: QueryState) extends Iterator[ExecutionContext] {
private var context: ExecutionContext = _
private var unwindIterator: Iterator[AnyValue] = _
private var nextItem: ExecutionContext = _

prefetch()

override def hasNext: Boolean = nextItem != null

override def next(): ExecutionContext = {
if (hasNext) {
val ret = nextItem
prefetch()
ret
} else Iterator.empty.next()
}

@tailrec
private def prefetch() {
nextItem = null
if (unwindIterator != null && unwindIterator.hasNext) {
nextItem = executionContextFactory.copyWith(context, variable, unwindIterator.next())
} else {
if (input.hasNext) {
context = input.next()
unwindIterator = makeTraversable(collection(context, state)).iterator.asScala
prefetch()
}
}
}
}
}

最佳答案

如果我阅读了您发布的错误消息

Neo.ClientError.Statement.SyntaxError: Type mismatch: expected List but was Integer (line 3, column 8 (offset: 40)) "UNWIND y AS z "



然后我注意到你发布了 UnwindPipe 的代码看起来你正在看一棵树而错过了森林。

所以让我解释一下我的意思。我认为您正在详细查看 UnwindPipe 的代码。并且在代码中看不到任何错误原因。但是,错误消息指出您有一个 SyntaxError而不是 Run time error .你看到你的问题了吗?

命令的解析器足够聪明,知道你给了第一个 UNWIND 一个列表。然后也足够聪明地知道结果不是列表,而是第二个 UNWIND需要一个列表,因此解析器响应错误消息。 UnwindPipe 的代码从未调用或执行,因为输入命令的解析失败。

关于neo4j - 嵌套 UNWIND - 非列表的选择性行为。这怎么可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52002225/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com