浏览代码

Added support for the row case

Needs more thorough testing, though.
Christophe Debruyne 8 年之前
父节点
当前提交
5464c58ab1

+ 14 - 4
src/r2rml/model/TermMap.java

@@ -317,6 +317,10 @@ public abstract class TermMap extends R2RMLResource {
 			for(TermMap tm : functionCall.getTermMaps()) {
 				set.addAll(tm.getReferencedColumns());
 			}
+		} else if(isGatherTermMap()) {
+			for(TermMap tm : gather.getTermMaps()) {
+				set.addAll(tm.getReferencedColumns());
+			}
 		} // else constant and thus empty set.
 		return set;
 	}
@@ -447,6 +451,11 @@ public abstract class TermMap extends R2RMLResource {
 			return ResourceFactory.createTypedLiteral(value);
 		}
 		
+		// Lists and Containers are RDFNodes in the rest of the code
+		// Just pass on their value
+		else if(isTermTypeList() || isTermTypeContainer()) {
+			return (RDFNode) value;
+		}
 		
 		return null;
 	}
@@ -503,6 +512,7 @@ public abstract class TermMap extends R2RMLResource {
 		} else if (isFunctionValuedTermMap()) {
 			List<Object> arguments = new ArrayList<>();
 			for(TermMap tm : functionCall.getTermMaps()) {
+				// We need the values (not RDF Nodes) to be passed to the function
 				Object argument = tm.getValueForRDFTerm(row);
 				arguments.add(argument);
 			}
@@ -514,7 +524,8 @@ public abstract class TermMap extends R2RMLResource {
 		} else if (isGatherTermMap()) {
 			List<Object> items = new ArrayList<>();
 			for(TermMap tm : gather.getTermMaps()) {
-				Object item = tm.getValueForRDFTerm(row);
+				// We need the RDF terms for the list or container
+				Object item = tm.generateRDFTerm(row);
 				if(item != null)
 					items.add(item);
 			}
@@ -533,9 +544,8 @@ public abstract class TermMap extends R2RMLResource {
 				
 				return c;
 			} else if(isTermTypeList()) {
-				RDFList list = ModelFactory.createDefaultModel().createList();
-				for(Object item : items)
-					list.add((RDFNode) item);
+				RDFNode[] members = items.toArray(new RDFNode[] {});
+				RDFList list = ModelFactory.createDefaultModel().createList(members);
 				return list;
 			}
 		}

+ 29 - 5
src/r2rml/model/TriplesMap.java

@@ -7,9 +7,13 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.jena.query.Dataset;
+import org.apache.jena.rdf.model.Alt;
+import org.apache.jena.rdf.model.Bag;
 import org.apache.jena.rdf.model.Property;
+import org.apache.jena.rdf.model.RDFList;
 import org.apache.jena.rdf.model.RDFNode;
 import org.apache.jena.rdf.model.Resource;
+import org.apache.jena.rdf.model.Seq;
 import org.apache.jena.rdf.model.Statement;
 import org.apache.jena.vocabulary.RDF;
 import org.apache.log4j.Logger;
@@ -318,12 +322,22 @@ public class TriplesMap extends R2RMLResource {
 	 * @param ngs The set of named graphs
 	 */
 	private void addTriplesToDataset(Dataset ds, Resource s, Property p, RDFNode o, Set<String> ngs) {
-		if(ngs.isEmpty()) {
-			ds.getDefaultModel().add(s, p, o);
-			count++;
-			return;
+		// If empty, then it will be stored in the default graph
+		// Explicitly add the default graph
+		if(ngs.isEmpty())
+			ngs.add(R2RML.defaultGraph.getURI());
+
+		// If container or list, add the default model of to each of the graphs!
+		if(isListOrContainer(o)) {
+			for(String ng : ngs) {
+				if(ng.equals(R2RML.defaultGraph.getURI())) {
+					ds.getDefaultModel().add(o.getModel());
+				} else {
+					ds.getNamedModel(ng).add(o.getModel());
+				}
+			}
 		}
-
+		
 		for(String ng : ngs) {
 			if(ng.equals(R2RML.defaultGraph.getURI())) {
 				ds.getDefaultModel().add(s, p, o);
@@ -335,6 +349,16 @@ public class TriplesMap extends R2RMLResource {
 		}
 	}
 
+	private boolean isListOrContainer(RDFNode o) {
+		if(o.isResource()) {
+			Resource r = o.asResource();
+			if(r.canAs(RDFList.class) || r.canAs(Bag.class) || r.canAs(Seq.class) || r.canAs(Alt.class)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
 	public String getBaseIRI() {
 		return baseIRI;
 	}

+ 2 - 1
test/resources/13.output/default.ttl

@@ -1,2 +1,3 @@
 <http://data.example.com/employee/7369>
-        a       <http://example.com/ns#Employee> .
+        a                             <http://example.com/ns#Employee> ;
+        <http://example.com/ns#name>  "SMITH" .

+ 1 - 1
test/resources/COL01.mapping.ttl

@@ -18,7 +18,7 @@
         		[ rr:column "FNAME" ] 
         		[ rr:column "LNAME" ]  
         	) ;
-        	rr:termType rdf:Bag ;
+        	rr:termType rdf:List ;
         ];
     ]