首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从三元组存储中提取三元组的代表性子集

如何从三元组存储中提取三元组的代表性子集
EN

Stack Overflow用户
提问于 2017-11-14 08:57:27
回答 3查看 325关注 0票数 1

我们有一个基于OpenLink Virtuoso的三重(或者更确切地说是四重)商店,其中大约有60亿个三元组。我们的合作者要求我们给他们提供一小部分数据,这样他们就可以测试他们的一些查询和算法。当然,如果我们从整个集合中提取图-主语-谓语-宾语四元组的一个随机子集,大多数针对该子集的SPARQL查询将找不到解决方案,因为一个很小的随机四元组子集将表示一个几乎完全不连通的图。是否有一种技术(可能是Virtuoso特定的)允许从整个集合S中提取四元组s的子集,以便对于给定的“选择”或“构造”SPARQL查询Q,对s执行的Q将返回与对整个集合S执行的Q相同的解决方案?如果可以做到这一点,就可以运行合作者希望能够对我们的数据集运行的所有示例查询,提取最小的可能子集并将其发送给他们(作为n-quads文件),以便他们可以将其加载到他们的三元组存储中。

EN

回答 3

Stack Overflow用户

发布于 2017-11-15 05:49:08

这没有预先构建的Virtuoso特定的解决方案。(ObDisclaimer:OpenLink Software生产Virtuoso,并雇佣我。)

正如上面的评论所指出的,这实际上是一个相当复杂的问题。从许多角度来看,“向同一查询提供相同结果的最小集是什么”的简单答案是“全部”,这很可能是最终的答案,因为需要付出努力才能得到任何令人满意的较小子集。

以下是更多的实验探索,而不是具体的建议。

  • 听起来你的合作者想要运行一些已知的查询,所以我首先对整个数据集运行该查询,然后对结果中出现的每个?s?p?o执行DESCRIBE,加载所有这些输出作为您的子集,并针对该子集测试原始查询。

如果已知,明确地将大集合中的所有本体数据包含在小集合中可能会有所帮助。

如果此序列没有提供预期的结果集,您可以尝试第二轮、第三轮或更多轮的DESCRIBE,这一轮针对上一轮中出现的每个新的?s?p?o

  • 将具有完整数据集的现有端点公开给您的合作者的想法值得考虑。您可以只授予他们读取权限和/或调整服务器配置,以限制处理时间、结果集大小和其活动的其他方面。

  • 对此的一种可能有助于思考的横向方法是,在SQL关系表世界中,单个表的一个有用子集很简单--它可以只是几行,其中至少包括您希望查询返回的那一行(通常是至少几行).With包含多个表的SQL关系模式,有用的子集扩展到包括每个表的行,这些行与任何其他表中的(不)所需行相关地连接。

现在,在RDF Relational Graph世界中,这些SQL Relational表中的每一行都可能被认为已经被分解,每个表的主键变成一个?s,每个列/字段变成一个?p,每个值变成一个?o

事实是(很明显?)更复杂(您可以查看W3C RDF2RDF work以及该工作的Direct MappingR2RML结果,以了解更多细节),但这提供了一个概念起点,用于考虑如何从包含满足针对数据集和子数据集的给定查询的最小子数据集的RDF数据集中找到四元组(或三元组)。

票数 1
EN

Stack Overflow用户

发布于 2017-11-15 10:54:22

您的数据库中必须有一个已知的实体类型计数,对吗?假设这是真的,为什么不简单地将SPARQL DESCRIBE应用于每个实体类型的每个实体的采样?

示例:

DESCRIBE ?EntitySample { { SELECT SAMPLE(?Entity) as ?EntitySample COUNT (?Entity) as ?EntityCount ?EntityType WHERE {?Entity a ?EntityType} GROUP BY ?EntityType HAVING (COUNT (?Entity) > 10) LIMIT 50 } }

票数 1
EN

Stack Overflow用户

发布于 2017-11-29 12:38:03

查询四元组的子集不能得到与查询整个数据集相同的结果,因为只考虑一小部分四元组,也会在答案中丢失四元组。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47275990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档