我是Neo4j的新手,在文档中找不到答案。
为什么ExecutionEngine.execute
会返回代理列表而不是真实节点?这是我的功能
def findUsers: List[ObjectId] = {
val query = engine.execute(s"MATCH (n:${User.name()}) RETURN n")
val it = query.columnAs[Node]("n")
val nodes: List[Node] = it.toList
for (node <- nodes; if node.hasLabel(User)) yield new ObjectId(node.getProperty("id").asInstanceOf[String])
}
执行时抛出异常
Exception in thread "main" org.neo4j.graphdb.NotInTransactionException
at org.neo4j.kernel.ThreadToStatementContextBridge.transaction(ThreadToStatementContextBridge.java:58)
at org.neo4j.kernel.ThreadToStatementContextBridge.statement(ThreadToStatementContextBridge.java:49)
at org.neo4j.kernel.impl.core.NodeProxy.hasLabel(NodeProxy.java:551)
我理解为什么会遇到异常。 NodeProxy
没有数据。再次进入DB等等。
但这不是效率低下吗? ExecutionEngine.execute
已经将查询包装到事务中。使另一个事务获取返回的“节点”的属性可能会导致数据不一致。为什么不用真正的Node
对象返回迭代器?
在我的场景中获取数据的正确方法是什么?