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

如果我采取简单的查询,例如匹配$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次,并将结果返回给客户端.

上一篇:mybatis报 :Error querying database. Cause: java.lang.NumberFormatException: For input string: “XX”


下一篇:php – Laravel查询关系模型:: has(‘relation’)不起作用