2013-04-10 27 views
2

我想通過任何RDF謂詞選擇與給定主題資源相關的資源列表。如何列出rdf語句的對象?

例如,如果在我的模型的資源ex:aliceex:bobex:peterex:Ben,我的模型包含:

ex:alice ex:meet ex:bob. 
ex:alice foaf:knows ex:Peter. 
ex:alice ex:talk :ben. 

我怎麼會寫回資源,這是對象的列表的方法任何三元給予特定資源作爲主題?例如,如果我給:

resourcesRelatedToResource(alice); 

我期待一個包含Bob,Peter和Ben的列表。

+1

難道你也許首先得到回到你問的類似問題?特別是http://stackoverflow.com/questions/15557778/how-to-get-a-list-of-resources-linked-to-a-resource-in-jena非常相似(我提供了一個答案)。 – 2013-04-11 16:04:47

+0

亞,但正如我上面提到的只有使用resourceName的對象列表必須返回...不是由資源和財產。 – user2057437 2013-04-11 23:18:27

+0

它看起來像你嘗試了另一個問題的東西http://stackoverflow.com/questions/15935783/return-resource-names-in-object-related-to-resource-subject-using-jena-apis,但有一個要求提供更多細節的評論。請首先回答,而不是提出新的問題。 – 2013-04-13 09:14:42

回答

2

使用Jena API,如果您調用listStatements,其主體,對象或謂詞的null參數將充當通配符。所以你只想通過主題Alice,並收集匹配三元組的對象,如果它們是對象的話。耶拿有一條捷徑爲:給定一個資源r,電話:

r.listProperties() 

等同於:

r.getModel().listStatements(r, null, (RDFNode) null) 

所以:

public void test() { 
    Model m = /*... your model here ...*/; 

    // get a reference to the Alice resource 
    Resource alice = m.getResource(NS + "alice"); 

    Set<Resource> result = resourcesRelatedToResource(alice); 
} 

/** Return a set of the resources related to the given input 
    * resource via any predicate */ 
protected Set<Resource> resourcesRelatedToResource(Resource r) { 
    // we don't care about duplicates, so use a Set 
    Set<Resource> objs = new HashSet<Resource>(); 

    // iterate over the triples with alice as subject 
    for (StmtIterator i = r.listProperties(); i.hasNext();) { 
     RDFNode obj = i.nextStatement().getObject(); 

     if (obj.isResource()) { 
      objs.add(obj.asResource()); 
     } 
    } 

    return objs; 
}