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; }
@Test public void PatternBlock_with_Filter() { GroupBlock block = (GroupBlock) Blocks.filter(Blocks.SPO, QNODE.p.eq(RDF.type)); Iterator<Bindings> iterator = visitor.visit(block, context).getFirst().iterator(); Map<String, NODE> row = iterator.next().toMap(); assertFalse(iterator.hasNext()); assertEquals(3, row.size()); assertEquals(id, row.get("s")); assertEquals(RDF.type, row.get("p")); }
@Test public void PatternBlock_with_unmatching_Filter() { GroupBlock block = (GroupBlock) Blocks.filter(Blocks.SPO, QNODE.p.eq(RDF.predicate)); Iterable<Bindings> iterable = visitor.visit(block, context).getFirst(); List<Bindings> rows = IteratorAdapter.asList(iterable.iterator()); assertEquals(0, rows.size()); }
private Multimap<UID, STMT> getProperties(ID subject, MappedClass mappedClass, boolean polymorphic) { Multimap<UID, STMT> properties = MultimapFactory.<UID, STMT> create(); if (mappedClass.getDynamicProperties().isEmpty() && !polymorphic && mappedClass.getMappedPredicates().size() < 5) { if (logger.isDebugEnabled()) { logger.debug("query for properties of " + subject); } RDFQuery query = new RDFQueryImpl(connection); CloseableIterator<STMT> stmts = query.where( Blocks.SPOC, QNODE.p.in(mappedClass.getMappedPredicates())) .set(QNODE.s, subject) .construct(Blocks.SPOC); try { while (stmts.hasNext()) { STMT stmt = stmts.next(); properties.put(stmt.getPredicate(), stmt); } } finally { stmts.close(); } } else { for (STMT stmt : findStatements(subject, null, null, null, true)) { properties.put(stmt.getPredicate(), stmt); } } return properties; }
private Multimap<UID, STMT> getInvProperties(ID object, MappedClass mappedClass) { Multimap<UID, STMT> properties = MultimapFactory.<UID, STMT> create(); if (logger.isDebugEnabled()) { logger.debug("query for inverse properties of " + object); } RDFQuery query = new RDFQueryImpl(connection); CloseableIterator<STMT> stmts = query.where( Blocks.SPOC, QNODE.p.in(mappedClass.getInvMappedPredicates())) .set(QNODE.o, object) .construct(Blocks.SPOC); try { while (stmts.hasNext()) { STMT stmt = stmts.next(); properties.put(stmt.getPredicate(), stmt); } } finally { stmts.close(); } return properties; }
private RDFQuery createQuery(MappedClass mappedClass, @Nullable UID type, boolean polymorphic) { RDFQuery query = new RDFQueryImpl(connection); if (type != null) { query.where(Blocks.S_TYPE); if (mappedClass.getContext() != null) { query.set(QNODE.typeContext, mappedClass.getContext()); } if (polymorphic) { Collection<UID> types = ontology.getSubtypes(type); if (types.size() > 1 && connection.getInferenceOptions().subClassOf()) { query.where(QNODE.type.in(types)); } else { query.set(QNODE.type, type); } } else { query.set(QNODE.type, type); } } query.where(Blocks.SPOC); if (!polymorphic && mappedClass.getDynamicProperties().isEmpty() && mappedClass.getMappedPredicates().size() < 5) { query.where(QNODE.p.in(mappedClass.getMappedPredicates())); } return query; }