如何列出rdf语句的对象?

时间:2013-04-10 20:59:30

标签: rdf jena ontology

我想通过任何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 个答案:

答案 0 :(得分:2)

使用Jena API,如果使用null参数调用listStatements作为通配符的主题,对象或谓词。因此,您只想传递主题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;
}