Ограничение итератора результатов запроса Graql вручную - PullRequest
0 голосов
/ 02 ноября 2018

Если я возьму простой запрос, такой как 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 Ответ

0 голосов
/ 02 ноября 2018

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

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

...