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

Jam*_*her 4 python querying python-3.x vaticle-typeql vaticle-typedb

如果我采取一个简单的查询,比如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
Run Code Online (Sandbox Code Playgroud)

results 是一个迭代器,所以我不能这样做:

limited_results = list(results)[:5]
Run Code Online (Sandbox Code Playgroud)

因为如果我这样做,那么所有的狗都将被列入清单,然后我将采取前5个,如果我在知识图中有1,000,000只狗,这实在是效率低下.

但我可以说:

limited_results = list(itertools.islice(results, 5))
Run Code Online (Sandbox Code Playgroud)

我应该得到前5只狗而不接触其他999,995只狗.

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

小智 5

如果你不希望Grakn检索图中的所有dogs并只访问前5个,那么你的方法都是有效的,因为它们都使用惰性迭代器,这意味着在你明确要求下一个结果之前不会进行检索.

如果直接发出查询match $x isa dog; limit 5; get;,Grakn将构建一个迭代器,它将迭代它5次并将结果返回给客户端.