如何搜索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”的实体,我通常必须假设关系位于相对于每个实体的固定位置,而在相对于任意位置搜索三元组时“根”要困难得多。这是对的吗?
答案 0 :(得分:2)
不是没有那么困难但是你的SPARQL查询可能会变得相当长。没有必要假定一个固定的根,因为您可以使用变量作为根,如我的示例所示。在根被修复的情况下,将变量替换为值。
注意 - 如果生成的查询中没有变量,那么它将更好地表达为ASK
查询。如果您使用SELECT
查询且没有变量,则无法区分匹配的查询结果和不匹配的查询结果。而ASK
查询返回true
或false
,具体取决于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查询就越大。