python - 手动限制 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 条,如果我在知识图中有 1,000,000 条狗,这真的是低效的。
但我可以说:
limited_results = list(itertools.islice(results, 5))
我应该只得到前 5 只狗,而不接触其他 999,995 只狗。
但我的问题是:这种方法有什么理由比limit 5
在查询中提供更慢match $x isa dog; limit 5; get;
吗?
解决方案
如果您不希望 Grakn 检索dog
图中的所有 s 并且只访问前 5 个,那么您的两种方法都是有效的,因为它们都使用惰性迭代器,这意味着在您明确要求下一个结果之前不会尝试检索.
如果您直接发出 query match $x isa dog; limit 5; get;
,Grakn 将构建一个迭代器,它只会迭代它 5 次并将结果返回给客户端。
推荐阅读
- python - 如何正确模拟和测试异步方法调用
- json - 在 react js 中获取本地 json 数据(在公共文件夹或 src 文件夹之外)
- python - 如何在python中计算任何给定年份的每个季度的周数
- android - app:installDebug 与 adb install 之间的差异
- swift - ARKit SCNTechnique 多通道渲染
- python-3.x - 根据过去 n 天过滤掉行
- r - 使用geom_link2时如何修改图例中hline的线型
- c# - C# 在面板中关闭一个表单并在同一面板中打开一个新表单
- python - 从不使用 selenium 的网页中抓取内容
- c++ - 如何在 QXlsx 中获取一行中使用的列数