2

我想通过任何 RDF 谓词选择与给定主题资源相关的资源列表。

例如,如果我的模型中的资源是ex:alice、和ex:bob,并且我的模型包含:ex:peterex:Ben

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

我将如何编写一个方法来返回资源列表,这些资源列表是给定特定资源作为主题的任何三元组的对象?例如,如果我给:

resourcesRelatedToResource( alice );

我希望有一个包含 Bob、Peter 和 Ben 的列表。

4

1 回答 1

2

使用 Jena API,如果您listStatements使用将充当通配符的主语、宾语或谓词的空参数进行调用。因此,您只想传递主题 Alice,并收集匹配三元组的对象(如果它们是对象)。Jena 有一个捷径:给定一个资源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;
}
于 2013-04-15T13:28:31.027 回答