我理解这样的模型:
它由三元组(主题谓词/属性对象)
A B C
C D E
E F G
G H I
X Y Z
我们可以用图表中的节点和边缘来表示上面的三胞胎组 我希望得到主题'A'值可以链接如上C-> E-> G-> I在模型和图表方面它应该从'C'节点返回SubGraph。
这是我的递归代码:
public Model getRecursive(String subject) {
Model newModel = ModelFactory.createDefaultModel();
StmtIterator it = this.model.listStatements();
while (it.hasNext()) {
Statement statement = it.next();
if(statement.getSubject().toString().equals(subject))
{
newModel = newModel.add(statement);
}
}
Model objectModel = ModelFactory.createDefaultModel();
it = newModel.listStatements();
while (it.hasNext()) {
Statement statement = it.next();
objectModel = objectModel.add(getRecursive(statement.getObject().toString()));
}
newModel = newModel.add(objectModel);
return newModel;
}
但我的问题是它的复杂性太高了 假设模型有1000个三元组,主题假设'A'的链长为10.然后根据我的代码,时间复杂度为10 * 1000,因为我的每个调用的递归代码遍历整个三元组以查找具有当前给定主题的三元组然后进一步递归调用Object值。
还有其他方法可以快速完成吗?我没有在图表和模型中得到任何可以快速完成的方法。
答案 0 :(得分:1)
耶拿模型已编入索引 - 您无需扫描它们即可查找。
首先,使用资源而不是字符串:
Resource subject = model.getResource(uristring) ;
然后传入累加器:
Model acc = ModelFactory.createDefaultModel();
以便不会一直复制结果。
recurse(Resource start, Model acc) ;
要访问模型,请使用listStatements(s,p,o)
,它会根据您要查找的内容提供参数。
StmtIterator sIter = model.listStatements(subject, null, (RDFNode)null) ;
仅查找该主题的陈述。
被打包为资源上的方法:
StmtIterator sIter = subject.listProperties() ;
(subject
知道它所在的模型。)
此外,您应该检查周期或它将永远递归。