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

时间:2018-11-02 14:30:05

标签: python python-3.x querying grakn graql

如果我进行一个简单的查询,例如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;慢吗?

1 个答案:

答案 0 :(得分:5)

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

如果您直接发出查询match $x isa dog; limit 5; get;,则Grakn将构建一个迭代器,并对其进行5次迭代,然后将结果返回给客户端。