openrdf芝麻模型中的多个过滤器
multiple filter in openrdf sesame Model
我想过滤一个模型,获取所有具有特定谓词和 C 类型主题的三元组。下面的代码没有 return 任何结果,有没有人知道如何实施了吗?
return triples.filter(null, new URIImpl(property.getFullIRI()), null).filter
(null, RDF.TYPE,new URIImpl(C.getFullIRI()));
问题是您在第一个结果上应用第二个 filter
- 但第一个过滤器的结果 仅 包含具有 属性 你过滤的 - 所以第二个过滤器永远不会 return 除了空结果之外的任何东西(因为中间结果中没有三元组会有 rdf:type
谓词)。
由于您以这种方式表达了 'non-sequential' 的次要约束,因此仅通过过滤无法解决此问题。您将需要构建一个新的 Model
并在进行时填充数据。沿着这些线的东西:
// always use a ValueFactory, avoid instantiating URIImpl directly.
ValueFactory vf = ValueFactoryImpl().getInstance();
URI c = vf.createURI(C.getFullIRI());
URI prop = vf.createURI(property.getFullIRI())
// create a new Model for the resulting triple collection
Model result = new LinkedHashModel();
// filter on the supplied property
Model propMatches = triples.filter(null, prop, null);
for(Resource subject: propMatches.subjects()) {
// check if the selected subject is of the supplied type
if (triples.contains(subject, RDF.TYPE, c)) {
// add the type triple to the result
result.add(subject, RDF.TYPE, c);
// add the property triple(s) to the result
result.addAll(propMatches.filter(subject, null, null));
}
}
return result;
以上适用于 Sesame 2。如果您使用的是 Sesame 4(支持 Java 8 及其 Stream API),您可以更轻松地执行此操作,如下所示:
return triples.stream().filter(st ->
{
if (prop.equals(st.getPredicate()) {
// add this triple if its subject has the correct type
return triples.contains(st.getSubject(), RDF.TYPE, c));
} else if (RDF.TYPE.equals(st.getPredicate())
&& c.equals(st.getObject()) {
// add this triple if its subject has the correct prop
return triples.contains(st.getSubject(), prop, null);
}
return false;
}).collect(Collectors.toCollection(LinkedHashModel::new));
我想过滤一个模型,获取所有具有特定谓词和 C 类型主题的三元组。下面的代码没有 return 任何结果,有没有人知道如何实施了吗?
return triples.filter(null, new URIImpl(property.getFullIRI()), null).filter
(null, RDF.TYPE,new URIImpl(C.getFullIRI()));
问题是您在第一个结果上应用第二个 filter
- 但第一个过滤器的结果 仅 包含具有 属性 你过滤的 - 所以第二个过滤器永远不会 return 除了空结果之外的任何东西(因为中间结果中没有三元组会有 rdf:type
谓词)。
由于您以这种方式表达了 'non-sequential' 的次要约束,因此仅通过过滤无法解决此问题。您将需要构建一个新的 Model
并在进行时填充数据。沿着这些线的东西:
// always use a ValueFactory, avoid instantiating URIImpl directly.
ValueFactory vf = ValueFactoryImpl().getInstance();
URI c = vf.createURI(C.getFullIRI());
URI prop = vf.createURI(property.getFullIRI())
// create a new Model for the resulting triple collection
Model result = new LinkedHashModel();
// filter on the supplied property
Model propMatches = triples.filter(null, prop, null);
for(Resource subject: propMatches.subjects()) {
// check if the selected subject is of the supplied type
if (triples.contains(subject, RDF.TYPE, c)) {
// add the type triple to the result
result.add(subject, RDF.TYPE, c);
// add the property triple(s) to the result
result.addAll(propMatches.filter(subject, null, null));
}
}
return result;
以上适用于 Sesame 2。如果您使用的是 Sesame 4(支持 Java 8 及其 Stream API),您可以更轻松地执行此操作,如下所示:
return triples.stream().filter(st ->
{
if (prop.equals(st.getPredicate()) {
// add this triple if its subject has the correct type
return triples.contains(st.getSubject(), RDF.TYPE, c));
} else if (RDF.TYPE.equals(st.getPredicate())
&& c.equals(st.getObject()) {
// add this triple if its subject has the correct prop
return triples.contains(st.getSubject(), prop, null);
}
return false;
}).collect(Collectors.toCollection(LinkedHashModel::new));