Neo4J с APOC и драйвером MongoDB, ограничение возвращаемых записей из Mongo

Ограничение количества возвращаемых записей в MongoDB так же просто, как db.collection.find().limit(n). Однако я хотел бы выдать эквивалентный запрос от Neo4J.

Учитывая, что запрос на поиск выдается из Neo4J следующим образом... apoc.mongodb.find(host, db, collection, query, project, sort) Мне трудно понять, как следует указать экземпляру MongoDB ограничить возвращаемые результаты перед потоковой передачей в Neo4J.

Я знаю о предложении Cypher LIMIT, однако это кажется плохой практикой, учитывая количество избыточных данных, которые будут передаваться из Mongo.

Есть ли еще способ добавить ограничение на результаты запроса перед потоком?


person Alex    schedule 23.11.2017    source источник


Ответы (1)


На данный момент это не доступно из коробки. Но вы можете добавить эту функцию.

В исходный код APOC внесите следующие изменения:

neo4j-apoc-procedures/src/main/java/apoc/mongodb/MongoDB.java:


@Procedure
@Description("apoc.mongodb.find(host-or-port,db-or-null,collection-or-null,query-or-null,projection-or-null,sort-or-null,[compatibleValues=true|false]) yield value - perform a find,project,sort operation on mongodb collection")
public Stream<MapResult> find(@Name("host") String hostOrKey, @Name("db") String db, @Name("collection") String collection, @Name("query") Map<String, Object> query, @Name("project") Map<String, Object> project, @Name("sort") Map<String, Object> sort, @Name(value = "compatibleValues", defaultValue = "false") boolean compatibleValues) {
    return getMongoColl(hostOrKey, db, collection, compatibleValues).find(query, project, sort).map(MapResult::new);
}

interface Coll extends Closeable {

...

    Stream<Map<String, Object>> find(Map<String, Object> query, Map<String, Object> project, Map<String, Object> sort, Map<String, Object> pagination);

neo4j-apoc-procedures/src/main/java/apoc/mongodb/MongoDBColl.java:


@Override
public Stream<Map<String, Object>> find(Map<String, Object> query, Map<String, Object> project, Map<String, Object> sort, Map<String, Object> pagination) {
    FindIterable<Document> documents = query == null ? collection.find() : collection.find(new Document(query));
    if (project != null) documents = documents.projection(new Document(project));
    if (sort != null) documents = documents.sort(new Document(sort));
    if (pagination != null) {
        Object skip = pagination.get("skip");
        Object limit = pagination.get("limit");
        if (skip != null) documents = documents.skip(Integer.parseInt(String.valueOf(skip)));
        if (limit != null) documents = documents.limit(Integer.parseInt(String.valueOf(limit)));
    }
    return asStream(documents);
}
person stdob--    schedule 24.11.2017