如果我进行一个简单的查询,例如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条狗,如果我在知识图中有100万只狗,那的确效率不高。
但是我可以说:
limited_results = list(itertools.islice(results, 5))
我应该只拿前5条狗,而不碰其他999,995条狗。
但是我的问题是:有什么理由会比在查询中提供limit 5
之类的match $x isa dog; limit 5; get;
慢吗?
答案 0 :(得分:5)
如果您不希望Grakn检索图中的所有dog
且仅访问前5个,则这两种方法都是有效的,因为它们都使用了惰性迭代器,这意味着不尝试进行检索直到您明确要求下一个结果。
如果您直接发出查询match $x isa dog; limit 5; get;
,则Grakn将构建一个迭代器,并对其进行5次迭代,然后将结果返回给客户端。