我们有一个基于OpenLink Virtuoso的三重(或者更确切地说是四重)商店,其中大约有60亿个三元组。我们的合作者要求我们给他们提供一小部分数据,这样他们就可以测试他们的一些查询和算法。当然,如果我们从整个集合中提取图-主语-谓语-宾语四元组的一个随机子集,大多数针对该子集的SPARQL查询将找不到解决方案,因为一个很小的随机四元组子集将表示一个几乎完全不连通的图。是否有一种技术(可能是Virtuoso特定的)允许从整个集合S中提取四元组s的子集,以便对于给定的“选择”或“构造”SPARQL查询Q,对s执行的Q将返回与对整个集合S执行的Q相同的解决方案?如果可以做到这一点,就可以运行合作者希望能够对我们的数据集运行的所有示例查询,提取最小的可能子集并将其发送给他们(作为n-quads文件),以便他们可以将其加载到他们的三元组存储中。
发布于 2017-11-15 05:49:08
这没有预先构建的Virtuoso特定的解决方案。(ObDisclaimer:OpenLink Software生产Virtuoso,并雇佣我。)
正如上面的评论所指出的,这实际上是一个相当复杂的问题。从许多角度来看,“向同一查询提供相同结果的最小集是什么”的简单答案是“全部”,这很可能是最终的答案,因为需要付出努力才能得到任何令人满意的较小子集。
以下是更多的实验探索,而不是具体的建议。
?s、?p和?o执行DESCRIBE,加载所有这些输出作为您的子集,并针对该子集测试原始查询。如果已知,明确地将大集合中的所有本体数据包含在小集合中可能会有所帮助。
如果此序列没有提供预期的结果集,您可以尝试第二轮、第三轮或更多轮的DESCRIBE,这一轮针对上一轮中出现的每个新的?s、?p和?o。
现在,在RDF Relational Graph世界中,这些SQL Relational表中的每一行都可能被认为已经被分解,每个表的主键变成一个?s,每个列/字段变成一个?p,每个值变成一个?o。
事实是(很明显?)更复杂(您可以查看W3C RDF2RDF work以及该工作的Direct Mapping和R2RML结果,以了解更多细节),但这提供了一个概念起点,用于考虑如何从包含满足针对数据集和子数据集的给定查询的最小子数据集的RDF数据集中找到四元组(或三元组)。
发布于 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 } }
发布于 2017-11-29 12:38:03
查询四元组的子集不能得到与查询整个数据集相同的结果,因为只考虑一小部分四元组,也会在答案中丢失四元组。
https://stackoverflow.com/questions/47275990
复制相似问题