如何从三重商店中提取三元组的代表子集

时间:2017-11-14 00:57:27

标签: sparql rdf semantic-web virtuoso

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

3 个答案:

答案 0 :(得分:1)

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

如上面的评论中所述,它实际上是一个相当复杂的问题。从许多角度来看,简单的回答是"什么是将相同结果传递给同一查询的最小集合?是"全部,"由于需要努力达到任何令人满意的较小子集,这可能会成为最终的答案。

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

  • 听起来您的协作者想要运行一些已知的查询,因此我首先针对您的完整数据集运行查询,然后对结果中显示的每个DESCRIBE以及?s?p执行?o,将所有 输出作为您的子集加载,然后测试对此的原始查询。

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

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

  • 将您的现有端点(包含完整数据集)暴露给协作者的想法值得考虑。您只能授予它们READ权限和/或调整服务器配置,以限制处理时间,结果集大小及其活动的其他方面。

  • 这可能有助于思考它的一个侧面方法可能是考虑在SQL关系表世界中,单个表的有用子集很容易 - 它可以只是几行,至少包括您希望查询返回的那个(并且通常至少有一些您想要查询的返回)。

    对于涉及多个表的SQL关系模式,有用的子集扩展为包括每个表的行,这些行与任何其他行中的(非)所需行相关联。

    现在,在RDF关系图世界中,每个"行"这些SQL关系表可能被认为已被分解,每个表的主键变为?o,每个列/字段变为?s,每个值变为{{1} }}

    现实(显然?)更复杂(您可能会查看W3C RDF2RDF work以及该工作的Direct MappingR2RML结果,以获取更多详细信息),但这会给出考虑如何从RDF数据集中找到四边形(或三元组)的概念起点,该数据集包含将满足针对数据集和子数据集的给定查询的最小子数据集。

答案 1 :(得分:1)

您的数据库中必须有已知的实体类型数,对吗?假设这是真的,为什么不简单地将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 } }

答案 2 :(得分:0)

查询四边形子集不能提供与查询整个数据集相同的结果,因为只考虑一小部分四边形,你也会在答案中松散四边形。