You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@clerezza.apache.org by re...@apache.org on 2010/05/27 10:48:06 UTC

svn commit: r948734 - in /incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core: ./ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/clerezza...

Author: reto
Date: Thu May 27 08:48:05 2010
New Revision: 948734

URL: http://svn.apache.org/viewvc?rev=948734&view=rev
Log:
CLEREZZA-218: initial drafts

Added:
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/   (with props)
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/pom.xml
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/Enricher.java
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/OrConnector.java
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/ResourceMatcher.java
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/CityWeatherEnricher.java
    incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/SiblingEnricher.java

Propchange: incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Thu May 27 08:48:05 2010
@@ -0,0 +1 @@
+target

Added: incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/pom.xml
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/pom.xml?rev=948734&view=auto
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/pom.xml (added)
+++ incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/pom.xml Thu May 27 08:48:05 2010
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.apache.clerezza</groupId>
+		<artifactId>org.apache.clerezza.rdf.web</artifactId>
+		<version>0.8-incubating-SNAPSHOT</version>
+	</parent>
+	<groupId>org.apache.clerezza</groupId>
+	<artifactId>org.apache.clerezza.rdf.enrichment.core</artifactId>
+	<packaging>bundle</packaging>
+	<version>0.1-incubating-SNAPSHOT</version>
+	<name>Clerezza - SCB Enrichment Core</name>
+	<description>The core part of SCB Enrichment</description>
+	<dependencies>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.clerezza</groupId>
+			<artifactId>org.apache.clerezza.rdf.core</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.clerezza</groupId>
+			<artifactId>org.apache.clerezza.utils</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.clerezza</groupId>
+			<artifactId>org.apache.clerezza.rdf.jena.serializer</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.clerezza</groupId>
+			<artifactId>org.apache.clerezza.rdf.jena.parser</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.clerezza</groupId>
+			<artifactId>org.apache.clerezza.rdf.ontologies</artifactId>
+		</dependency>
+	</dependencies>
+</project>
+

Added: incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/Enricher.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/Enricher.java?rev=948734&view=auto
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/Enricher.java (added)
+++ incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/Enricher.java Thu May 27 08:48:05 2010
@@ -0,0 +1,196 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.clerezza.rdf.enrichment;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import org.apache.clerezza.rdf.core.BNode;
+import org.apache.clerezza.rdf.core.NonLiteral;
+import org.apache.clerezza.rdf.core.Resource;
+import org.apache.clerezza.rdf.core.Triple;
+import org.apache.clerezza.rdf.core.TripleCollection;
+import org.apache.clerezza.rdf.core.UriRef;
+
+/**
+ * use cases:
+ * - resources with a common eg:parent should be eg:sibling
+ * - for every foaf:Person there shall be a foaf:PersonalProfileDocument
+ * - every non literal resource shall be subject of rdf:type rdfs:Resource statemet
+ * - every eg:City shall have a eg:currentWeather property pointing to a bnode with temperature and humidity
+ *
+ * features:
+ * - pre-filter (filter filter): only filter matching resource-matcher are forwarded
+ * - on invocation with matching resource the Enricher knows which criteria matched
+ *
+ * @author reto
+ */
+/*
+ * scala would allow to make reasonable use of generich, here having
+ * ResourceFilter<T extends Resource> makes implementation harder as e.g. a
+ * ResourceFilter<NonLiteral> could not be returned by getObjectFilter
+ *
+ * locks: There's currently no recommeended mechanism to prevent Enricher
+ * to make the enrichted graph appear stable while in a lock
+ */
+public abstract class Enricher {
+
+
+	public static abstract class ResourceFilter {
+
+		public abstract boolean accept(Resource resource);
+
+		public Set<Resource> getAcceptable(TripleCollection tc) {
+			Set<Resource> result = new HashSet<Resource>();
+			for (Triple triple : tc) {
+				{
+					NonLiteral subject = triple.getSubject();
+					if (accept(subject)) {
+						result.add(subject);
+					}
+				}
+				{
+					Resource object = triple.getObject();
+					if (accept(object)) {
+						result.add(object);
+					}
+				}
+			}
+			return result;
+		}
+	}
+
+
+	public ResourceFilter acceptAll = new ResourceFilter() {
+
+		@Override
+		public boolean accept(Resource resource) {
+			return true;
+		}
+	};
+
+	/**
+	 * returns the additionl triples to a specified base graph. This method is
+	 * only invoked with resources matching the respective Filter.
+	 *
+	 * @param subject
+	 * @param predicate
+	 * @param object
+	 * @param base
+	 * @return
+	 */
+	public abstract Iterator<Triple> filter(NonLiteral subject, UriRef predicate,
+			Resource object, TripleCollection base);
+
+
+	//IDEA add way for impl to specify fields that must not be null in filter
+	//queries (in which case null is replaced with all matching resources)
+	//and a way to specify that the impl ignores a specfied value in which case
+	//a filter is applied manually on that value.
+	//ISSUE: the query <tt>null, null, "13,4"</tt> might cause computation of a huge lots
+	//of values
+	public ResourceFilter getSubjectFilter() {
+		return acceptAll;
+	}
+
+	public ResourceFilter getPropertyFilter() {
+		return acceptAll;
+	}
+
+	public ResourceFilter getObjectFilter() {
+		return acceptAll;
+	}
+
+	//utility methods for implementations
+	private class LocalBNode extends BNode {
+
+		boolean isFrom(Enricher enricher) {
+			return (enricher == Enricher.this);
+		}
+	}
+
+	protected BNode createLocalBNode() {
+		return new LocalBNode();
+	}
+	private ResourceFilter localBNodeFilter = new ResourceFilter() {
+
+		@Override
+		public boolean accept(Resource resource) {
+			return (resource instanceof LocalBNode)
+					&& ((LocalBNode) resource).isFrom(Enricher.this);
+		}
+	};
+
+	protected ResourceFilter getLocalBNodeFilter() {
+		return localBNodeFilter;
+	}
+	protected static ResourceFilter getFilterForSubjectsWith(UriRef predicate,
+			Resource object) {
+		return null;
+	}
+
+	protected static ResourceFilter getFilterForSubjectsWithProperty(UriRef predicate) {
+		return null;
+	}
+
+	/** creates a resource filters that matches only the specified resource
+	 *
+	 * @param resources
+	 * @return
+	 */
+	protected static ResourceFilter getExtensionalFilter(Resource... resources) {
+		return null;
+	}
+
+	protected static ResourceFilter getDataTypeFilter(UriRef dataType) {
+		return null;
+	}
+
+	/** utility method to filter an iterator
+	 *
+	 */
+	protected Iterator<Triple> filter(NonLiteral subject, UriRef predicate,
+			Resource object, final Iterator<Triple> baseIter) {
+		//TODO filter on the fly without list
+		final List<Triple> tripleList = new ArrayList<Triple>();
+		while (baseIter.hasNext()) {
+			Triple triple = baseIter.next();
+			if ((subject != null) &&
+				(!triple.getSubject().equals(subject))) {
+					continue;
+				}
+				if ((predicate != null) &&
+						(!triple.getPredicate().equals(predicate))) {
+					continue;
+				}
+				if ((object != null) &&
+						(!triple.getObject().equals(object))) {
+					continue;
+				}
+			tripleList.add(triple);
+		}
+
+		final Iterator<Triple> listIter = tripleList.iterator();
+		return listIter;
+
+	}
+
+}

Added: incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/OrConnector.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/OrConnector.java?rev=948734&view=auto
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/OrConnector.java (added)
+++ incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/OrConnector.java Thu May 27 08:48:05 2010
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.clerezza.rdf.enrichment;
+
+import org.apache.clerezza.rdf.core.Resource;
+import org.apache.clerezza.rdf.enrichment.Enricher.ResourceFilter;
+
+/**
+ * A filter that accepts a Resource iff any of its underlying base filters 
+ * accepts it
+ *
+ * @author reto
+ */
+public class OrConnector extends ResourceFilter {
+
+	private ResourceFilter[] baseFilters;
+
+	public OrConnector(ResourceFilter... baseFilters) {
+		this.baseFilters = baseFilters;
+	}
+
+	@Override
+	public boolean accept(Resource resource) {
+		for (ResourceFilter resourceFilter : baseFilters) {
+			if (resourceFilter.accept(resource)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+}

Added: incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/ResourceMatcher.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/ResourceMatcher.java?rev=948734&view=auto
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/ResourceMatcher.java (added)
+++ incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/main/java/org/apache/clerezza/rdf/enrichment/ResourceMatcher.java Thu May 27 08:48:05 2010
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.clerezza.rdf.enrichment;
+
+/**
+ *
+ * @author reto
+ */
+class ResourceMatcher {
+
+}

Added: incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/CityWeatherEnricher.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/CityWeatherEnricher.java?rev=948734&view=auto
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/CityWeatherEnricher.java (added)
+++ incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/CityWeatherEnricher.java Thu May 27 08:48:05 2010
@@ -0,0 +1,156 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.clerezza.rdf.enrichment;
+
+import java.lang.ref.WeakReference;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import org.apache.clerezza.rdf.core.BNode;
+import org.apache.clerezza.rdf.core.LiteralFactory;
+import org.apache.clerezza.rdf.core.NonLiteral;
+import org.apache.clerezza.rdf.core.Resource;
+import org.apache.clerezza.rdf.core.Triple;
+import org.apache.clerezza.rdf.core.TripleCollection;
+import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.core.impl.TripleImpl;
+import org.apache.clerezza.rdf.ontologies.RDF;
+import org.apache.clerezza.utils.IteratorMerger;
+
+/**
+ * add a a weather property pointing to the weather expressed a a bnode with
+ * current temperature and humidity (fake values based on time and city name)
+ *
+ * @author reto
+ */
+public class CityWeatherEnricher extends Enricher {
+
+	//ontology part
+	UriRef classCity = new UriRef("http://example.org/ontology#City");
+	UriRef weatherProperty = new UriRef("http://example.org/ontology#weather");
+	UriRef temperatureProperty = new UriRef("http://example.org/ontology#temperature");
+	UriRef humidityProperty = new UriRef("http://example.org/ontology#humidity");
+	final private static UriRef xsdDouble =
+			new UriRef("http://www.w3.org/2001/XMLSchema#double");
+	private final ResourceFilter classCityFilter = getFilterForSubjectsWith(RDF.type, classCity);
+	private final Map<NonLiteral, WeakReference<BNode>> cityWeatherMap = new HashMap<NonLiteral, WeakReference<BNode>>();
+
+	/*
+	 * we might be able to tell more about things that are a City and about
+	 * the Waether-Bnode we created
+	 */
+	@Override
+	public ResourceFilter getSubjectFilter() {
+		return new OrConnector(
+				classCityFilter, getLocalBNodeFilter());
+	}
+
+	@Override
+	public ResourceFilter getPropertyFilter() {
+		return getExtensionalFilter(weatherProperty, temperatureProperty, humidityProperty);
+	}
+
+	@Override
+	public ResourceFilter getObjectFilter() {
+		return new OrConnector(getLocalBNodeFilter(), getDataTypeFilter(xsdDouble));
+	}
+
+	@Override
+	public Iterator<Triple> filter(final NonLiteral subject,
+			final UriRef predicate, final Resource object,
+			final TripleCollection base) {
+		if (subject == null) {
+
+			Iterator<Triple> iteratorCitySubjects =  new IteratorMerger(
+					new Iterator<Iterator<Triple>>() {
+
+						Iterator<Resource> subjectIterator =
+								classCityFilter.getAcceptable(base).iterator();
+
+						@Override
+						public boolean hasNext() {
+							return subjectIterator.hasNext();
+						}
+
+						@Override
+						public void remove() {
+							throw new UnsupportedOperationException("Not supported.");
+						}
+
+						@Override
+						public Iterator<Triple> next() {
+							return CityWeatherEnricher.this.filterSubjectNonNull(
+									(NonLiteral)subjectIterator.next(),
+									predicate, object, base);
+						}
+					});
+			//TODO add with bnode subjects
+			return iteratorCitySubjects;
+		} else {
+			return filterSubjectNonNull(subject, predicate, object, base);
+		}
+		
+	}
+
+	private Iterator<Triple> filterSubjectNonNull(final NonLiteral subject,
+			final UriRef predicate, final Resource object,
+			final TripleCollection base) {
+		Set<Triple> resultSet = new HashSet<Triple>();
+		if (classCityFilter.accept(subject)) {
+			if (predicate.equals(weatherProperty)) {
+				BNode weatherNode = getWeatherNode(subject);
+				resultSet.add(new TripleImpl(subject, predicate, weatherNode));
+			}
+		} else {
+			//TODO get the real wather of that city
+			if (predicate.equals(temperatureProperty) || (predicate == null)) {
+				resultSet.add(new TripleImpl(subject,
+						temperatureProperty, LiteralFactory.getInstance().createTypedLiteral(21.4)));
+			}
+			if (predicate.equals(humidityProperty) || (predicate == null)) {
+				resultSet.add(new TripleImpl(subject,
+						humidityProperty, LiteralFactory.getInstance().createTypedLiteral(0.51)));
+			}
+		}
+		return resultSet.iterator();
+	}
+
+	/**
+	 * for every city the is one weather node
+	 * 
+	 * @param subject
+	 * @return
+	 */
+	private synchronized BNode getWeatherNode(NonLiteral city) {
+		WeakReference<BNode> nodeRef =  cityWeatherMap.get(city);
+		if (nodeRef != null) {
+			BNode node = nodeRef.get();
+			if (node != null) {
+				return node;
+			}
+		}
+		BNode newNode =  createLocalBNode();
+		cityWeatherMap.put(city, new WeakReference<BNode>(newNode));
+		return newNode;
+	}
+}
+
+

Added: incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/SiblingEnricher.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/SiblingEnricher.java?rev=948734&view=auto
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/SiblingEnricher.java (added)
+++ incubator/clerezza/issues/CLEREZZA-218/org.apache.clerezza.rdf.enrichment/org.apache.clerezza.rdf.enrichment.core/src/test/java/org/apache/clerezza/rdf/enrichment/SiblingEnricher.java Thu May 27 08:48:05 2010
@@ -0,0 +1,160 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.clerezza.rdf.enrichment;
+
+import java.util.AbstractSet;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import org.apache.clerezza.rdf.core.NonLiteral;
+import org.apache.clerezza.rdf.core.Resource;
+import org.apache.clerezza.rdf.core.Triple;
+import org.apache.clerezza.rdf.core.TripleCollection;
+import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.core.impl.TripleImpl;
+
+/**
+ * add a siblingProperty to things with a common parent. every resource with a
+ * parent is a sibling of itself.
+ *
+ * @author reto
+ */
+public class SiblingEnricher extends Enricher {
+
+	//ontology part
+	/**
+	 * points to the parent of the subject
+	 */
+	UriRef parentProperty = new UriRef("http://example.org/ontology#parent");
+	UriRef siblingProperty = new UriRef("http://example.org/ontology#sibling");
+
+	/*
+	 * we might be able to tell more about things tht have a parent
+	 */
+	@Override
+	public ResourceFilter getSubjectFilter() {
+		return getFilterForSubjectsWithProperty(parentProperty);
+	}
+
+	/*
+	 * the only thing we can say is if two things are siblings
+	 */
+	@Override
+	public ResourceFilter getPropertyFilter() {
+		return getExtensionalFilter(siblingProperty);
+	}
+	/*
+	 * the object has a parent too
+	 */
+
+	@Override
+	public ResourceFilter getObjectFilter() {
+		return getFilterForSubjectsWithProperty(parentProperty);
+	}
+
+	/*
+	 * the predicate is null or siblingProperty
+	 */
+	@Override
+	public Iterator<Triple> filter(final NonLiteral subject,
+			final UriRef predicate, final Resource object,
+			final TripleCollection base) {
+		if ((subject != null) && (object != null)) {
+			if (areSiblings(subject, object, base)) {
+				return Collections.singleton(
+						(Triple) new TripleImpl(subject, siblingProperty, object)).iterator();
+			} else {
+				List<Triple> emptyList = Collections.emptyList();
+				return emptyList.iterator();
+			}
+		} else {
+			if (subject != null) {
+				final Iterator<NonLiteral> siblings = 
+						getSiblings(subject, base).iterator();
+				return new Iterator<Triple>() {
+
+					@Override
+					public boolean hasNext() {
+						return siblings.hasNext();
+					}
+
+					@Override
+					public Triple next() {
+						return new TripleImpl(subject, siblingProperty, siblings.next());
+					}
+
+					@Override
+					public void remove() {
+						throw new UnsupportedOperationException(
+								"cannot delete infered triple");
+					}
+				};
+			}
+			if (object != null) {
+				final Iterator<NonLiteral> siblings = 
+						getSiblings((NonLiteral) object,base).iterator();
+				return new Iterator<Triple>() {
+
+					@Override
+					public boolean hasNext() {
+						return siblings.hasNext();
+					}
+
+					@Override
+					public Triple next() {
+						return new TripleImpl(siblings.next(), siblingProperty, object);
+					}
+
+					@Override
+					public void remove() {
+						throw new UnsupportedOperationException(
+								"cannot delete infered triple");
+					}
+				};
+			}
+			//both subjecta nd object are null
+			//TODO
+			throw new UnsupportedOperationException("not yet pmpliemented");
+		}
+	}
+
+	private boolean areSiblings(NonLiteral subject, Resource object, TripleCollection base) {
+		return getSiblings(subject, base).contains(object);
+	}
+
+	private Set<NonLiteral> getSiblings(NonLiteral resource, TripleCollection base) {
+		Set<Resource> parents = new HashSet<Resource>();
+		{
+			Iterator<Triple> parentTriples = base.filter(resource, parentProperty, null);
+			while (parentTriples.hasNext()) {
+				parents.add(parentTriples.next().getObject());
+			}
+		}
+		Set<NonLiteral> resultSet = new HashSet<NonLiteral>();
+		for (Resource parent : parents) {
+			Iterator<Triple> childTriples = base.filter(null, parentProperty, parent);
+			while (childTriples.hasNext()) {
+				resultSet.add(childTriples.next().getSubject());
+			}
+		}
+		return resultSet;
+	}
+}