2013-03-13 61 views
6

我正試圖發現模型中是否有特定的資源。對於我使用:Jena - 如何知道某個特定資源是否在模型中?

model.getResource("example") 

檢查文檔,這種方法準確地表現爲createResource。然後,即使它不在模型中,我也會得到一個新的資源。

如何檢查我是否有資源避免其創建?

在此先感謝!

+0

也許這個鏈接[Interface Model](http://jena.apache.org/documentation/javadoc/jena/com/hp/hpl/jena/rdf/model/Model.html)很有用。 – 2013-03-13 13:43:47

+1

經過一番研究,我找到了下一個方法。我不知道這是否是實現它的最好方法,但是可以工作: Resource toSearch = ResourceFactory.createResource(「example」);如果(!model.containsResource(toSearch))...; – jevora 2013-03-13 13:53:58

+1

如果它解決了,然後發佈答案並接受它,所以具有相同問題的下一個人將找到答案,你也會得到一個徽章! :) – Boaz 2013-03-13 13:57:17

回答

11

在耶拿,Resource對象本身並不在模型。該模型僅包含三元組 - Statement包含主題,謂詞和對象(通常縮寫爲SPO)的對象。 S,P或O中的任何一個都可以是資源(注意Property是Jena和RDF標準中的Resource的子類型)。所以,你需要完善你的問題,從「此模型包含此資源」要麼:

  • 確實模型M包含資源R作爲一門學科?

  • 模型M是否包含資源R作爲主語,謂語或賓語?

這是可以實現的:

Resource r = ... ; 
Model m = ... ; 

// does m contain r as a subject? 
if (m.contains(r, null, (RDFNode) null)) { 
    .. 
} 

// does m contain r as s, p or o? 
if (m.containsResource(r)) { 
    .. 
} 

順便說一句,你的代碼示例中你有

model.getResource("example") 

這將返回對應於給定的URI Resource對象,但不側 - 影響模型中的三元組。這就是Model同時具有getResourcecreateResource的原因 - get可能會稍微更有效,因爲它重用資源對象,但語義本質上是相同的。但是,您傳遞給getResourcecreateResource的論據應該是URI。如果你開始使用像"example"這樣的令牌來代替完整的URI,那麼你就會從未來借鑑麻煩,所以我建議在你習慣之前停止這種壞習慣!

+0

非常感謝。這絕對是解決方案。關於壞習慣,別擔心,在我的開發中,我使用真正的URI。我只是用「例子」,因爲這次沒關係。 – jevora 2013-03-14 11:47:14

+0

檢查解決方案:有幾個包含哪些符合r,null,null的包含。我寧願建議: model.contains(resource,null,(RDFNode)null) – jevora 2013-03-14 11:54:40

+0

好的。是的,'contains()'的方法簽名非常自由,需要對'object'進行強制轉換,這是一個很痛苦的過程,但這是一個很早以前在Jena早期的歷史中做出的設計決策,並且會過分破壞現在改變。 – 2013-03-14 20:39:21

2

經過一番研究,我找到了下一條路。我不知道這是不是真的達到它的最佳方式,但工程:

Resource toSearch = ResourceFactory.createResource("example"); 
if(!model.containsResource(toSearch))...; 
+0

這是一個正確的答案,但我必須等待2天才能標記爲正確 – jevora 2013-03-13 22:56:28

相關問題