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;
+ }
+}