Neo4j возвращает вложенный объект из процедуры расширения - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь создать процедуру расширения для Neo4j, которая будет возвращать сложный объект (имеется в виду объект, который связан с другим объектом).

public static class A {
    public final String a;

    public A(String a) {
        this.a = a;
    }
}

public static class Output {
    public Object out;

    public Output(Object out) {
        this.out = out;
    }
}

@Procedure(value = "my_proc", mode = Mode.READ)
public Stream<Output> myProc() {
    return Stream.of(new Output(new A("a")));
}

Когда я выполняю call my_proc(); с помощью браузера Neo4j I, он просто показывает прогресскруг и никогда не вернусь.Когда я выполняю то же самое с помощью драйвера Java, я получаю следующее исключение:

SEVERE: [0xedd70cbd] Fatal error occurred in the pipeline
org.neo4j.driver.internal.shaded.io.netty.handler.codec.DecoderException: Failed to read inbound message:
   at org.neo4j.driver.internal.async.inbound.InboundMessageHandler.channelRead0(InboundMessageHandler.java:87)
   at org.neo4j.driver.internal.async.inbound.InboundMessageHandler.channelRead0(InboundMessageHandler.java:35)
   ....
   at org.neo4j.driver.internal.shaded.io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645)
   at org.neo4j.driver.internal.shaded.io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580)
   at org.neo4j.driver.internal.shaded.io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497)
   at org.neo4j.driver.internal.shaded.io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459)
   at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
   at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138)
   at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IndexOutOfBoundsException: readerIndex(49) + length(1) exceeds writerIndex(49): PooledDuplicatedByteBuf(ridx: 49, widx: 49, cap: 133, unwrapped: PooledUnsafeDirectByteBuf(ridx: 51, widx: 89, cap: 133))
    at org.neo4j.driver.internal.shaded.io.netty.buffer.AbstractByteBuf.checkReadableBytes0(AbstractByteBuf.java:1401)
    at org.neo4j.driver.internal.shaded.io.netty.buffer.AbstractByteBuf.readByte(AbstractByteBuf.java:707)
    at org.neo4j.driver.internal.async.inbound.ByteBufInput.readByte(ByteBufInput.java:45)
    at org.neo4j.driver.internal.packstream.PackStream$Unpacker.unpackLong(PackStream.java:479)
    at org.neo4j.driver.internal.messaging.PackStreamMessageFormatV1$Reader.unpackValue(PackStreamMessageFormatV1.java:479)
    at org.neo4j.driver.internal.messaging.PackStreamMessageFormatV1$Reader.unpackRecordMessage(PackStreamMessageFormatV1.java:464)
    at org.neo4j.driver.internal.messaging.PackStreamMessageFormatV1$Reader.read(PackStreamMessageFormatV1.java:390)
    at org.neo4j.driver.internal.async.inbound.InboundMessageHandler.channelRead0(InboundMessageHandler.java:83)
    ... 39 more

Есть ли способ вернуть вложенный объект без сериализации его в json, прежде чем вернуть его?

1 Ответ

0 голосов
/ 31 мая 2018
@Procedure(value = "ebc.neo4j.justamap", mode = Mode.READ)
public Stream<MapResult> justamap() {
    HashMap<String, Object> v1Map = new HashMap<String, Object>(1);
    HashMap<String, Object> v2Map = new HashMap<String, Object>(1);
    v2Map.put("a", "a string");
    v1Map.put("map inside", v2Map);

    return Stream.of(new MapResult(v1Map));
}


public static class MapResult {
    public Map internalmap;

    public MapResult(Map aInternalId) {
        this.internalmap = aInternalId;
    }
}

Возможно что-то подобное вышеописанному (настолько глубокое, насколько вы хотите), но возврат пользовательских объектов для использования в Cypher (что является идеей при написании процедуры) не сработает, так как Cypher не имеетИдея, что эти пользовательские объекты.Таким образом, вам придется провести некоторую дезинфекцию .

Надеюсь, это поможет.

С уважением, Том

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...