2014-12-02 48 views
2

我有一個關於它的幾個關係的RDF文件。一些關係傳遞性關閉。我之前發佈了一個關於如何在這個link中在Sparql中構建屬性傳遞閉包的問題。現在我可以用屬性的傳遞閉包來構造新的三元組,這意味着在整個路徑上都被提取出來。 例如,有一個part_of關係,如果?apart_of?b,並且?bpart_of?c,所以我們可以推斷,apart_of?c。然後我這樣做了我的查詢:如何在SPARQL中構造結合兩個TRANSITIVE CLOSURE的新三元組?

construct {?a :part_of ?b} where {?a :part_of+ ?b . filter(?a != ?b) } 

然後我有另一個傳遞閉包。例如,有一個is_a關係,如果?ais_a?b,並且?bis_a?c,所以我們可以推斷,?ais_a?c。然後,我做出這樣的查詢:

construct {?a :is_a ?b} where {?a :is_a+ ?b . filter(?a != ?b)} 

後來才知​​道有另一個條件是包括這兩個傳遞閉包: 例如,如果?apart_of?b,並且?bis_a?c,所以我們可以推斷,?apart_of?c。那我可以這樣做我的查詢嗎?

construct {?a :part_of ?c} 
where { 
     ?a :part_of+ ?b . 
     ?b :is_a+ ?c . 
     filter(?a != ?c) 
} 
+0

這更清楚在一個新的問題比在評論解釋。謝謝!這非常明確和具體! – 2014-12-02 19:28:28

回答

1

後來才知​​道有這包括這兩個 傳遞閉包的另一個條件:?????舉例來說,如果一個part_of B,和b is_a C,所以 我們可以推斷出一個part_of ?C。那我可以這樣做我的查詢嗎?

要編寫單獨的,它只是:?

construct { ?a :part_of ?c } 
where { 
    ?a :part_of ?b . 
    ?b :is_a ?c 
} 

(我不知道這是否真的是有道理的,但畢竟,c爲一個類型,而不是一個實例。我的手指是我的一部分,我是一個人,但我的手指不是人類的一部分,即使手指可能是人類的一部分。)

由於您不使用?b in構造部分,你甚至可以把它變成一個屬性路徑:

construct { ?a :part_of ?c } 
where { ?a :part_of/:is_a ?c } 

但是,這些都不處理問題的傳遞部分。我們來看看。你說的是,只要你可以遵循一個鏈:part_of,就應該有一個:part_of鏈接,並且每當有一個:part_of後跟一個:is_a時,應該有一個:part_of鏈接。可以結合使用這些具有:

construct { ?a :part_of ?c } 
where { ?a (:part_of+/:is_a?)+ ?c } 

路徑(:part_of+/:is_a?)+指:

  • (1)的一次或多次出現:
    • (2)的一次或多次出現:part_of
    • (3)可選地跟隨
    • (4)零次或一次出現:is_a

如果你看一下要推斷每個地方:part_of關係,你會看到這個模式相匹配。

+0

我明白了。但是,如果我想檢查以下所有鏈:is_a關係?因此,如果想獲得的(1)中的一個或多個正好:(2)中的一個或多個正好:part_of(3)任選地,隨後(4)中的一個或多個正好:is_a;那麼我只需要改變'?'之後:is_a進入'+'對嗎? – 2014-12-03 14:25:36

+0

我不清楚你在問什麼。 – 2014-12-03 14:39:39

+0

我的意思是:1)一個或多個出現次數:(2)中的一個或多個正好:part_of(3)任選地,隨後(4)的零點或多個正好:is_a;那麼我只需要將'*'改爲'*'後面的'*'? – 2014-12-03 14:44:38