我想通过任何RDF谓词选择与给定主题资源相关的资源列表。
例如,如果我的模型中的资源是ex:alice
,ex:bob
,ex:peter
和ex:Ben
,我的模型包含:
ex:alice ex:meet ex:bob.
ex:alice foaf:knows ex:Peter.
ex:alice ex:talk :ben.
我如何编写一个方法来返回资源列表,这些资源是特定资源作为主题的任何三元组的对象?例如,如果我给:
resourcesRelatedToResource( alice );
我期待一个包含Bob,Peter和Ben的列表。
答案 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;
}