private Map<ID, Multimap<UID, STMT>> getInvProperties(MappedClass mappedClass, Collection<ID> objects) { RDFQuery query = new RDFQueryImpl(connection); query.where( Blocks.SPOC, QNODE.p.in(mappedClass.getInvMappedPredicates())); if (objects.size() == 1) { query.set(QNODE.o, objects.iterator().next()); } else { query.where(QNODE.o.in(objects)); } CloseableIterator<STMT> stmts = query.construct(Blocks.SPOC); Map<ID, Multimap<UID, STMT>> invProperties = getPropertiesMap(stmts, true); for (ID id : objects) { if (!invProperties.containsKey(id)) { invProperties.put(id, MultimapFactory.<UID, STMT> create()); } } return invProperties; }
private List<STMT> findStatements(@Nullable ID subject, @Nullable UID predicate, @Nullable NODE object, @Nullable UID context, boolean includeInferred) { if (logger.isDebugEnabled()) { logger.debug("findStatements " + subject + " " + predicate + " " + object + " " + context); } // rdf type inference if (RDF.type.equals(predicate) && subject == null && object != null && connection.getInferenceOptions().subClassOf()) { Collection<UID> types = ontology.getSubtypes(object.asURI()); if (types.size() > 1) { RDFQuery query = new RDFQueryImpl(connection); CloseableIterator<STMT> stmts = query.where( Blocks.SPOC, QNODE.o.in(types)) .set(QNODE.p, predicate) .construct(Blocks.SPOC); return IteratorAdapter.asList(stmts); } } return IteratorAdapter.asList(connection.findStatements(subject, predicate, object, context, includeInferred)); }
@Test public void Pattern_with_Filters() { Block pattern = Blocks.pattern(subject, predicate, object); List<Predicate> filters = Arrays.<Predicate> asList( subject.eq(new UID(TEST.NS)), subject.in(RDF.type, RDF.first), predicate.eq(RDFS.label), subject.ne(new UID(TEST.NS)), object.isNull(), object.isNotNull(), object.stringValue().startsWith("X"), object.lit().like("X%"), object.lit().matches(".*"), object.lit().lt("D"), object.lit().gt("B"), object.lit().loe("C"), object.lit().goe("C"), object.lit().eqIgnoreCase("X"), object.lit().isEmpty() ); for (Predicate filter : filters) { query().where(pattern, filter).selectSingle(subject); } }