手动限制 Graql 查询结果迭代器

Manually limiting Graql query results iterator

如果我进行一个简单的查询,例如 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 只狗。

但我的问题是:有什么理由比在 match $x isa dog; limit 5; get; 这样的查询中提供 limit 5 更慢?

如果您不希望 Grakn 检索图中的所有 dog 并且只访问前 5 个,您的两种方法都是有效的,因为它们都使用惰性迭代器,这意味着没有检索一直尝试直到您明确要求下一个结果。

如果您直接发出查询 match $x isa dog; limit 5; get;,Grakn 将构建一个迭代器,它只会迭代 5 次,然后 return 将结果发送给客户端。