Можно ли передавать результаты процедуры Neo4j?JAVA

Программисты JAVA общаются здесь
Anonymous
Можно ли передавать результаты процедуры Neo4j?

Сообщение Anonymous »

При написании пользовательской процедуры neo4j процедура должна возвращать поток элементов.
Можно ли этого избежать

Код: Выделить всё

List output = new ArrayList
// fill the list in a transaction
return output.stream()
и находить/возвращать результаты итеративно (т. е. не собирать все в список и затем преобразовывать его в поток)?
Может быть, что-то вроде
p>

Код: Выделить всё

    @Procedure(value = "bar", mode = Mode.READ)
public Stream bar() {
try (final Transaction tx = db.beginTx()) {
final ResourceIterator iterator = tx.findNodes(Label.label("A"));
return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
.map(node -> new MyLong((Long) node.getProperty("a")))
.onClose(tx::commit);
}
}
( оборачивает одно длинное поле)?
К сожалению, описанную выше процедуру нельзя использовать, потому что:

Код: Выделить всё

Neo.ClientError.Procedure.ProcedureCallFailed
Failed to invoke procedure `bar`: Caused by: org.neo4j.graphdb.NotInTransactionException: The transaction has been closed.
Однако этот работает (но он не использует транзакции, поэтому на практике бесполезен):

Код: Выделить всё

    @Procedure(value = "foo", mode = Mode.READ)
public Stream foo() {
final Iterator iterator = LongStream.range(0, 100000000000000L).iterator();
return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
.map(MyLong::new);
}
и вызов foo() доходного значения со значением предела возвращаемого значения 3 возвращает первые 3 элемента.


Подробнее здесь: https://stackoverflow.com/questions/790 ... -procedure

Вернуться в «JAVA»