我想通过任何 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 的列表。
最佳答案
使用 Jena API,如果您使用主语、宾语或谓语的 null 参数调用 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;
}
关于rdf - 如何列出rdf语句的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15936291/