在RDF图中搜索部分匹配

时间:2011-02-15 15:27:07

标签: rdf semantic-web sparql

如何搜索RDF数据库以查找与样本图最重叠的图段?

例如,假设我的数据库存储以下任意图形:

entity1 [
    type "TOP" ;
    attr1 [
        attr11 [
            attr111 "apple" ;
        ] ;
        attr12 [
            attr121 "orange" ;
        ] ;
        attr13 [
            attr131 "banana" ;
        ] ;
    ] ;
    attr2 [
        attr21 [
            attr211 "falcon" ;
        ] ;
        attr22 [
            attr221 "pigeon" ;
        ] ;
        attr23 [
            attr231 "parrot" ;
        ] ;
    ] ;
] .
entity2 [
    type "TOP" ;
    attr11 [
        attr111 "apple" ;
    ] ;
    attr12 [
        attr121 "orange" ;
    ] ;
] .
entity3 [
    type "TOP" ;
    attr2 [
        attr_middle [
            attr21 [
                attr211 "falcon" ;
            ] ;
            attr22 [
                attr221 "pigeon" ;
            ] ;
            attr23 [
                attr231 "parrot" ;
            ] ;
        ] ;
    ] ;
] .

现在说我有样本图:

sample [
    type "TOP" ;
    attr11 [
        attr111 "apple" ;
    ] ;
    attr12 [
        attr121 "orange" ;
    ] ;
    attr13 [
        attr131 "banana" ;
    ] ;
    attr21 [
        attr211 "falcon" ;
    ] ;
    attr22 [
        attr221 "pigeon" ;
    ] ;
    attr23 [
        attr231 "parrot" ;
    ] ;
] .

显然,数据库中的任何内容都不能完美匹配样本,但每个实体都会部分匹配,即使每个图中的编号三元组存在于不同的级别。

我如何找到与样本最接近的匹配?在这种情况下,我希望返回一个查询,首先排序最佳匹配,[entity1, entity3, entity2]

我还是RDF的新手,如果我的术语不对,请原谅我。由于我目前了解RDF数据库,我正在尝试做的不是通常如何使用它们。如果我想使用SPARQL查询找到“包含”关系attr111 =“apple”的实体,我通常必须假设关系位于相对于每个实体的固定位置,而在相对于任意位置搜索三元组时“根”要困难得多。这是对的吗?

1 个答案:

答案 0 :(得分:2)

不是没有那么困难但是你的SPARQL查询可能会变得相当长。没有必要假定一个固定的根,因为您可以使用变量作为根,如我的示例所示。在根被修复的情况下,将变量替换为值。

注意 - 如果生成的查询中没有变量,那么它将更好地表达为ASK查询。如果您使用SELECT查询且没有变量,则无法区分匹配的查询结果和不匹配的查询结果。而ASK查询返回truefalse,具体取决于WHERE子句是否匹配

如果您的SPARQL处理器支持SPARQL 1.1,那么您可以使用属性路径.e.g

SELECT * WHERE { ?s ex:predicate / ex:predicate / ex:predicate "value" }

如果您只有SPARQL 1.0,那么您必须明确说明匹配:

SELECT * WHERE
{
  ?s ex:predicate _:b1 .
  _:b1 ex:predicate _:b2 .
  _:b2 ex:predicate "value" .
}

请注意,语义上这两个表单实际上是等价的 - SPARQL 1.1表单是SPARQL 1.0表单的一个很好的语法快捷方式。

显然,想要匹配的Graph部分越大,SPARQL查询就越大。