Ограничение итератора результатов запроса Graql вручную

Если я возьму простой запрос, такой как match $x isa dog; limit 5; get; тогда независимо от того, сколько собак хранится в Grakn, я получаю 5 результатов назад. Это нормально, но что, если я не знаю, сколько собак я хочу, когда я делаю запрос, и хочу ограничить количество, которое я получу позже в своем коде?

Вот моя идея использовать клиент Python:

import grakn
client = grakn.Grakn(uri="localhost:48555")
session = client.session(keyspace="dogs_keyspace")
tx = session.transaction(grakn.TxType.WRITE)

results = tx.query('match $x isa dog; get;')  # I don't limit now, so I can do it later

results является итератором, поэтому я не могу сделать это:

limited_results = list(results)[:5]

потому что если я это сделаю, то все собаки будут внесены в список, а затем я возьму первые 5, что действительно неэффективно, если у меня есть 1 000 000 собак в графе знаний.

Но я могу сказать:

limited_results = list(itertools.islice(results, 5))

и я должен получить только первые 5 собак, не касаясь других 999 995 собак.

Но мой вопрос: есть ли причина, по которой такой подход будет медленнее, чем limit 5 в запросе как match $x isa dog; limit 5; get;?

1 ответ

Решение

Если вы не хотите, чтобы Гракн получил все dogЕсли они находятся на графике и имеют доступ только к первым 5, оба ваших подхода действительны, так как оба используют ленивые итераторы, что означает, что поиск не предпринимается, пока вы явно не запросите следующий результат.

Если вы выдаете непосредственно запрос match $x isa dog; limit 5; get;Гракн создаст итератор, и он будет перебирать его всего 5 раз и возвращать результат клиенту.

Другие вопросы по тегам