如果我采取简单的查询,例如匹配$x isa dog;限制5;得到;那么无论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
结果是一个迭代器,所以我不能这样做:
limited_results = list(results)[:5]
因为如果我这样做,那么所有的狗都将被列入清单,然后我将采取前5个,如果我在知识图中有1,000,000只狗,这是非常低效的.
但我可以说:
limited_results = list(itertools.islice(results, 5))
我应该得到前5只狗而不接触其他999,995只狗.
但我的问题是:有没有理由这种方法比在匹配$x isa dog中提供限制5更慢?限制5;得到;?
解决方法:
如果您不希望Grakn检索图中的所有狗并且只访问前5个,那么您的两种方法都是有效的,因为它们都使用惰性迭代器,这意味着在您明确要求下一个结果之前不会尝试检索.
如果您直接发出查询匹配$x isa dog;限制5;得到;,Grakn将构建一个迭代器,它将迭代它5次,并将结果返回给客户端.