}
}
};
baseGraph.addGraphListener(typeChangeListener, new FilterTriple(null, RDF.type, null));
indexedPropertyChangeListener = new GraphListener() {
@Override
public void graphChanged(List<GraphEvent> events) {
for (GraphEvent e : events) {
logger.debug("Triple: " + e.getTriple());
Triple triple = e.getTriple();
UriRef predicate = triple.getPredicate();
Set<VirtualProperty> vProperties = property2IncludingVProperty.get(predicate);
List<Resource> indexedResources = new ArrayList<Resource>();
logger.debug("Predicate: " + predicate);
for (VirtualProperty vProperty : vProperties) {
logger.debug("Subject: " + " " + triple.getSubject());
followInversePaths(triple.getSubject(),
vProperty.pathToIndexedResource(predicate), indexedResources);
}
for (Resource resource : indexedResources) {
GraphNode node = new GraphNode(resource, e.getGraph());
List<UriRef> types = new ArrayList<UriRef>();
Lock lock = node.readLock();
lock.lock();
try {
Iterator<Resource> resources = node.getObjects(RDF.type);
while (resources.hasNext()) {
Resource res = resources.next();
if (res instanceof UriRef) {
types.add((UriRef) res);
}
}
} finally {
lock.unlock();
}
for (UriRef type : types) {
if (type2IndexedProperties.containsKey(type)) {
scheduleForReindex(resource);
}
}
}
}
}
};
baseGraph.addGraphListener(indexedPropertyChangeListener,
new FilterTriple(null, null, null) {
@Override
public boolean match(Triple triple) {
UriRef predicate = triple.getPredicate();
//check indirectly involved properties