2011-02-15 85 views
3

如何將搜索的RDF數據庫來尋找重疊的最有樣品圖圖的部分?搜索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」的實體,我通常必須假定關係位於相對於每個實體的固定位置,在相對於每個實體的任意位置搜索三元組「根」要困難得多。那是對的嗎?

回答

2

不,它並不難,但你的SPARQL查詢可能會變得相當長時間才能達到這一點。沒有必要假定一個固定的根,因爲你可以使用變量作爲我的例子中所示的根。在根固定的情況下,將該變量替換爲一個值。

注意 - 如果結果查詢中沒有變量,那麼它會更好地表示爲ASK查詢。如果使用SELECT查詢並且沒有變量,則無法區分匹配的查詢結果和不匹配的查詢結果。而一個ASK查詢返回取決於WHERE條款是否如果你的SPARQL處理器支持SPARQL 1.1,那麼你可以使用屬性路徑.eg

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

如果你只有SPARQL 1.0接着匹配

要麼truefalse你必須明確聲明匹配,如下所示:

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

請注意,語義上這兩種形式實際上是等效的 - SPARQL 1.1表單是一個很好的syntac用於SPARQL 1.0表單的快捷方式。

顯然,更大的要匹配你的圖的部分增長較大的SPARQL查詢會得到。