2011
gStore: Answering SPARQL Queries via Subgraph Matching
1.存在问题
1)他们无法以可扩展的方式支持带通配符的SPARQL
例如:
我们可以通过以下SPARQL从RDF数据集中检索1809年2月12日出生并于1865年4月15日去世的人的姓名
我们可能知道一位重要的政治人物于2月12日出生并于4月15日去世,但我们不知道他的确切出生和死亡年份。 在这种情况下,我们必须使用通配符执行查询
2)现有系统对于存储RDF的数据库频繁更新是很困难的
社交网络中的RDF数据(例如FOAF项目(foaf-project.org))也经常更新,以代表个人不断变化的关系
2.解决方法
2.1 主要思路
将RDF数据转换为RDF图,可以通过将SPARQL查询转换为子图匹配查询RDF图
RDF graph :
1) RDF图的大小(即顶点和边的数量)比典型图数据库考虑的大小大几个数量级。
2)RDF图中顶点和边缘标签的基数比传统图数据库中的基数大得多
3)SPARQL查询结合了同一实体的几多个属性,因此,它们倾向于包含星号作为子查询
线下处理:
将dataset 转换为邻接矩阵表->
将实体或者类顶点进行编码->
将这些顶点签名链接起来以形成数据签名图G *->
2.2 编码Encoding
将每个相邻的边的标签和对应的相邻顶点的标签编码为 位串
1)相邻的边的标签
how to generate ?
2)相邻顶点的标签
2.3 索引结构和查询算法
2.3.1 索引结构
how to build a VS-tree?
1)built S-tree
2)built VS-tree
若S-tree中有两个结点的 孩子结点 间至少存在一条边,
就可以引入一条超级边。若有多条边,这条超级边的bitString 为多条边 进行 或运算的结果
也能够引入一条自己到自己的边,如果该结点的一个孩子
到另外一个孩子之间也存在边
2.3.2 匹配算法
1)定义:
Q* 在G* 上的 summary matche
1)结点bitString一样
2)对于查询图Q*中的任意一条边,都能在GI中找到一条超级边
作用:用于缩减 查询空间
1)如果在 G1 上找不到一个 摘要匹配 那么Q*在G* 上的匹配就不存在
2)在G1中的一个结点 是 某个顶点标签 ui的祖先,那么就一定会形成 一个 Q*在G* 上 摘要匹配
Valid child state:
1)是孩子结点
2)是Q* 的一个摘要匹配
2)算法细节
-
在查询图Q* 3 里找到他的 summary matches
,将这个summary matches 入队 H -
每次从队列H中取一个summary matche,求他的child state
3)从这些子状态中过滤掉没有用的,找到 valid child state
可以达到一个 缩减 查询空间的效果
4)重复以上过程,直到到达叶子结点
5)最后在叶子结点上进行 匹配