在RDF图中搜索部分匹配

在RDF图中搜索部分匹配,rdf,semantic-web,sparql,Rdf,Semantic Web,Sparql,如何搜索RDF数据库以查找与示例图重叠最多的图段 例如,假设我的数据库存储以下任意图形: entity1 [ type "TOP" ; attr1 [ attr11 [ attr111 "apple" ; ] ; attr12 [ attr121 "orange" ; ] ; attr13 [ attr131 "banana" ;

如何搜索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" ;
    ] ;
] .
显然,数据库中没有任何内容与样本完全匹配,但每个实体都部分匹配样本,即使comman三元组存在于每个图形的不同级别

如何找到与样本最接近的匹配项?在本例中,我希望查询首先返回排序为最佳匹配的
[entity1,entity3,entity2]


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

不,这并不难,但是您的SPARQL查询可能会变得相当长,无法实现这一点。没有必要假定一个固定的根,因为您可以对根使用变量,如我的示例所示。在根是固定的情况下,用变量替换值

注意-如果结果查询中没有变量,那么最好将其表述为
ASK
查询。如果使用
选择
查询,并且没有变量,则无法区分匹配的查询结果和不匹配的查询结果。而
ASK
查询根据
WHERE
子句是否匹配返回
true
false

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

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形式的一种很好的语法快捷方式

显然,您想要匹配的图形部分越大,SPARQL查询将得到的结果就越大