Project

General

Profile

« Previous | Next » 

Revision 10062

Added by Jing Tao over 7 years ago

Use a new class to overwrite the class RdfXmlSubprocessor in d1-processor since that one has a method to use solr http server directly.

View differences:

metacat-index/src/main/java/edu/ucsb/nceas/metacat/index/annotation/MetacatRdfXmlSubprocessor.java
1
/**
2
 * This program is free software; you can redistribute it and/or modify
3
 * it under the terms of the GNU General Public License as published by
4
 * the Free Software Foundation; either version 2 of the License, or
5
 * (at your option) any later version.
6
 *
7
 * This program is distributed in the hope that it will be useful,
8
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
 * GNU General Public License for more details.
11
 *
12
 * You should have received a copy of the GNU General Public License
13
 * along with this program; if not, write to the Free Software
14
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
15
 */
16
package edu.ucsb.nceas.metacat.index.annotation;
17

  
18
import edu.ucsb.nceas.metacat.index.resourcemap.ResourceMapSubprocessor;
19

  
20
import java.io.ByteArrayOutputStream;
21
import java.io.IOException;
22
import java.io.InputStream;
23
import java.net.URI;
24
import java.net.URISyntaxException;
25
import java.util.ArrayList;
26
import java.util.HashMap;
27
import java.util.Iterator;
28
import java.util.List;
29
import java.util.Map;
30
import java.util.Set;
31

  
32
import javax.xml.xpath.XPathExpressionException;
33

  
34
import org.apache.commons.codec.EncoderException;
35
import org.apache.commons.io.IOUtils;
36
import org.apache.commons.logging.Log;
37
import org.apache.commons.logging.LogFactory;
38
import org.dataone.cn.index.util.PerformanceLogger;
39
import org.dataone.cn.indexer.annotation.SparqlField;
40
import org.dataone.cn.indexer.annotation.TripleStoreService;
41
import org.dataone.cn.indexer.parser.IDocumentSubprocessor;
42
import org.dataone.cn.indexer.parser.ISolrDataField;
43
import org.dataone.cn.indexer.parser.SubprocessorUtility;
44
import org.dataone.cn.indexer.solrhttp.HTTPService;
45
import org.dataone.cn.indexer.solrhttp.SolrDoc;
46
import org.dataone.cn.indexer.solrhttp.SolrElementField;
47
import org.springframework.beans.factory.annotation.Autowired;
48

  
49
import com.hp.hpl.jena.ontology.OntModel;
50
import com.hp.hpl.jena.query.Dataset;
51
import com.hp.hpl.jena.query.Query;
52
import com.hp.hpl.jena.query.QueryExecution;
53
import com.hp.hpl.jena.query.QueryExecutionFactory;
54
import com.hp.hpl.jena.query.QueryFactory;
55
import com.hp.hpl.jena.query.QuerySolution;
56
import com.hp.hpl.jena.query.ResultSet;
57
import com.hp.hpl.jena.rdf.model.ModelFactory;
58
import com.hp.hpl.jena.tdb.TDBFactory;
59

  
60
/**
61
 * A solr index parser for an RDF/XML file.
62
 * The solr doc of the RDF/XML object only has the system metadata information.
63
 * The solr docs of the science metadata doc and data file have the annotation information.
64
 */
65
public class MetacatRdfXmlSubprocessor implements IDocumentSubprocessor {
66

  
67
    private static Log log = LogFactory.getLog(MetacatRdfXmlSubprocessor.class);
68
    private static PerformanceLogger perfLog = PerformanceLogger.getInstance();
69
    /**
70
     * If xpath returns true execute the processDocument Method
71
     */
72
    private List<String> matchDocuments = null;
73

  
74
    private List<ISolrDataField> fieldList = new ArrayList<ISolrDataField>();
75

  
76
    private List<String> fieldsToMerge = new ArrayList<String>();
77

  
78
    @Autowired
79
    private HTTPService httpService = null;
80

  
81
    @Autowired
82
    private String solrQueryUri = null;
83

  
84
    @Autowired
85
    private SubprocessorUtility processorUtility;
86

  
87
    /**
88
     * Returns true if subprocessor should be run against object
89
     * 
90
     * @param formatId the the document to be processed
91
     * @return true if this processor can parse the formatId
92
     */
93
    public boolean canProcess(String formatId) {
94
        return matchDocuments.contains(formatId);
95
    }
96

  
97
    public List<String> getMatchDocuments() {
98
        return matchDocuments;
99
    }
100

  
101
    public void setMatchDocuments(List<String> matchDocuments) {
102
        this.matchDocuments = matchDocuments;
103
    }
104

  
105
    public List<ISolrDataField> getFieldList() {
106
        return fieldList;
107
    }
108

  
109
    public void setFieldList(List<ISolrDataField> fieldList) {
110
        this.fieldList = fieldList;
111
    }
112

  
113
    @Override
114
    public Map<String, SolrDoc> processDocument(String identifier, Map<String, SolrDoc> docs,
115
            InputStream is) throws Exception {
116

  
117
        if (log.isTraceEnabled()) {
118
            log.trace("INCOMING DOCS to processDocument(): ");
119
            serializeDocuments(docs);
120
        }
121

  
122
        SolrDoc resourceMapDoc = docs.get(identifier);
123
        List<SolrDoc> processedDocs = process(resourceMapDoc, is);
124
        Map<String, SolrDoc> processedDocsMap = new HashMap<String, SolrDoc>();
125
        for (SolrDoc processedDoc : processedDocs) {
126
            processedDocsMap.put(processedDoc.getIdentifier(), processedDoc);
127
        }
128

  
129
        if (log.isTraceEnabled()) {
130
            log.trace("PREMERGED DOCS from processDocument(): ");
131
            serializeDocuments(processedDocsMap);
132
        }
133

  
134
        // Merge previously processed (but yet to be indexed) documents
135
        Map<String, SolrDoc> mergedDocs = mergeDocs(docs, processedDocsMap);
136

  
137
        if (log.isTraceEnabled()) {
138
            log.trace("OUTGOING DOCS from processDocument(): ");
139
            serializeDocuments(mergedDocs);
140
        }
141

  
142
        return mergedDocs;
143
    }
144

  
145
    /**
146
     * Serialize documents to be indexed for debugging
147
     * 
148
     * @param docs
149
     * @throws IOException
150
     */
151
    private void serializeDocuments(Map<String, SolrDoc> docs) {
152
        StringBuilder documents = new StringBuilder();
153
        documents.append("<docs>");
154

  
155
        for (SolrDoc doc : docs.values()) {
156
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
157
            try {
158
                doc.serialize(baos, "UTF-8");
159

  
160
            } catch (IOException e) {
161
                log.trace("Couldn't serialize documents: " + e.getMessage());
162
            }
163
            
164
            try {
165
                documents.append(baos.toString());
166
            } finally {
167
                IOUtils.closeQuietly(baos);
168
            }
169
        }
170
        documents.append("</docs>");
171
        log.trace(documents.toString());
172
    }
173

  
174
    private List<SolrDoc> process(SolrDoc indexDocument, InputStream is) throws Exception {
175
        
176
        // get the triplestore dataset
177
        long start = System.currentTimeMillis();
178
        Dataset dataset = TripleStoreService.getInstance().getDataset();
179
        perfLog.log("RdfXmlSubprocess.process gets a dataset from tripe store service ", System.currentTimeMillis() - start);
180
        
181
        // read the annotation
182
        String indexDocId = indexDocument.getIdentifier();
183
        String name = indexDocId;
184

  
185
        //Check if the identifier is a valid URI and if not, make it one by prepending "http://"
186
        URI nameURI;
187
        String scheme = null;
188
        try {
189
            nameURI = new URI(indexDocId);
190
            scheme = nameURI.getScheme();
191
            
192
        } catch (URISyntaxException use) {
193
            // The identifier can't be parsed due to offending characters. It's not a URL
194
            
195
            name = "https://cn.dataone.org/cn/v1/resolve/"+indexDocId;
196
        }
197
        
198
        // The had no scheme prefix. It's not a URL
199
        if ((scheme == null) || (scheme.isEmpty())) {
200
            name = "https://cn.dataone.org/cn/v1/resolve/"+indexDocId;
201
            
202
        }
203
        
204
        long startOntModel = System.currentTimeMillis();
205
        boolean loaded = dataset.containsNamedModel(name);
206
        if (!loaded) {
207
            OntModel ontModel = ModelFactory.createOntologyModel();
208
            ontModel.read(is, name);
209
            dataset.addNamedModel(name, ontModel);
210
        }
211
        perfLog.log("RdfXmlSubprocess.process adds ont-model ", System.currentTimeMillis() - startOntModel);
212
        //dataset.getDefaultModel().add(ontModel);
213

  
214
        // process each field query
215
        Map<String, SolrDoc> documentsToIndex = new HashMap<String, SolrDoc>();
216
        long startField = System.currentTimeMillis();
217
        for (ISolrDataField field : this.fieldList) {
218
            long filed = System.currentTimeMillis();
219
            String q = null;
220
            if (field instanceof SparqlField) {
221
                q = ((SparqlField) field).getQuery();
222
                q = q.replaceAll("\\$GRAPH_NAME", name);
223
                Query query = QueryFactory.create(q);
224
                log.trace("Executing SPARQL query:\n" + query.toString());
225
                QueryExecution qexec = QueryExecutionFactory.create(query, dataset);
226
                ResultSet results = qexec.execSelect();
227
                while (results.hasNext()) {
228
                    SolrDoc solrDoc = null;
229
                    QuerySolution solution = results.next();
230
                    log.trace(solution.toString());
231

  
232
                    // find the index document we are trying to augment with the annotation
233
                    if (solution.contains("pid")) {
234
                        String id = solution.getLiteral("pid").getString();
235

  
236
                        // TODO: check if anyone with permissions on the annotation document has write permission on the document we are annotating
237
                        boolean statementAuthorized = true;
238
                        if (!statementAuthorized) {
239
                            continue;
240
                        }
241

  
242
                        // otherwise carry on with the indexing
243
                        solrDoc = documentsToIndex.get(id);
244
                        if (solrDoc == null) {
245
                            solrDoc = new SolrDoc();
246
                            solrDoc.addField(new SolrElementField(SolrElementField.FIELD_ID, id));
247
                            documentsToIndex.put(id, solrDoc);
248
                        }
249
                    }
250

  
251
                    // add the field to the index document
252
                    if (solution.contains(field.getName())) {
253
                        String value = solution.get(field.getName()).toString();
254
                        SolrElementField f = new SolrElementField(field.getName(), value);
255
                        if (!solrDoc.hasFieldWithValue(f.getName(), f.getValue())) {
256
                            solrDoc.addField(f);
257
                        }
258
                    }
259
                }
260
            }
261
            perfLog.log("RdfXmlSubprocess.process process the field "+field.getName(), System.currentTimeMillis() - filed);
262
        }
263
        perfLog.log("RdfXmlSubprocess.process process the fields total ", System.currentTimeMillis() - startField);
264
        // clean up the triple store
265
        TDBFactory.release(dataset);
266

  
267
        // merge the existing index with the new[er] values
268
        long getStart = System.currentTimeMillis();
269
        Map<String, SolrDoc> existingDocuments = getSolrDocs(documentsToIndex.keySet());
270
        perfLog.log("RdfXmlSubprocess.process get existing solr docs ", System.currentTimeMillis() - getStart);
271
        Map<String, SolrDoc> mergedDocuments = mergeDocs(documentsToIndex, existingDocuments);
272
        mergedDocuments.put(indexDocument.getIdentifier(), indexDocument);
273

  
274
        perfLog.log("RdfXmlSubprocess.process() total take ", System.currentTimeMillis() - start);
275
        return new ArrayList<SolrDoc>(mergedDocuments.values());
276
    }
277

  
278
    private Map<String, SolrDoc> getSolrDocs(Set<String> ids) throws Exception {
279
        Map<String, SolrDoc> list = new HashMap<String, SolrDoc>();
280
        if (ids != null) {
281
            for (String id : ids) {
282
                //SolrDoc doc = httpService.retrieveDocumentFromSolrServer(id, solrQueryUri);
283
                SolrDoc doc = ResourceMapSubprocessor.getSolrDoc(id);;
284
                if (doc != null) {
285
                    list.put(id, doc);
286
                }
287
            }
288
        }
289
        return list;
290
    }
291

  
292
    /*
293
     * Merge existing documents from the Solr index with pending documents
294
     */
295
    private Map<String, SolrDoc> mergeDocs(Map<String, SolrDoc> pending,
296
            Map<String, SolrDoc> existing) throws Exception {
297
        long start = System.currentTimeMillis();
298
        Map<String, SolrDoc> merged = new HashMap<String, SolrDoc>();
299

  
300
        Iterator<String> pendingIter = pending.keySet().iterator();
301
        while (pendingIter.hasNext()) {
302
            String id = pendingIter.next();
303
            SolrDoc pendingDoc = pending.get(id);
304
            SolrDoc existingDoc = existing.get(id);
305
            SolrDoc mergedDoc = new SolrDoc();
306
            if (existingDoc != null) {
307
                // merge the existing fields
308
                for (SolrElementField field : existingDoc.getFieldList()) {
309
                    mergedDoc.addField(field);
310

  
311
                }
312
            }
313
            // add the pending
314
            for (SolrElementField field : pendingDoc.getFieldList()) {
315
                if (field.getName().equals(SolrElementField.FIELD_ID)
316
                        && mergedDoc.hasField(SolrElementField.FIELD_ID)) {
317
                    continue;
318
                }
319

  
320
                // only add if we don't already have it
321
                if (!mergedDoc.hasFieldWithValue(field.getName(), field.getValue())) {
322
                    mergedDoc.addField(field);
323
                }
324
            }
325

  
326
            // include in results
327
            merged.put(id, mergedDoc);
328
        }
329

  
330
        // add existing if not yet merged (needed if existing map size > pending map size)
331
        Iterator<String> existingIter = existing.keySet().iterator();
332

  
333
        while (existingIter.hasNext()) {
334
            String existingId = existingIter.next();
335

  
336
            if (!merged.containsKey(existingId)) {
337
                merged.put(existingId, existing.get(existingId));
338

  
339
            }
340
        }
341

  
342
        if (log.isTraceEnabled()) {
343
            log.trace("MERGED DOCS with existing from the Solr index: ");
344
            serializeDocuments(merged);
345
        }
346
        perfLog.log("RdfXmlSubprocess.merge total ", System.currentTimeMillis() - start);
347
        return merged;
348
    }
349

  
350
    @Override
351
    public SolrDoc mergeWithIndexedDocument(SolrDoc indexDocument) throws IOException,
352
            EncoderException, XPathExpressionException {
353
        return processorUtility.mergeWithIndexedDocument(indexDocument, fieldsToMerge);
354
    }
355

  
356
    public List<String> getFieldsToMerge() {
357
        return fieldsToMerge;
358
    }
359

  
360
    public void setFieldsToMerge(List<String> fieldsToMerge) {
361
        this.fieldsToMerge = fieldsToMerge;
362
    }
363
}
metacat-index/src/main/resources/application-context-oa.xml
3 3
	xmlns:p="http://www.springframework.org/schema/p"
4 4
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
5 5

  
6
	<bean id="rdfXmlSubprocessor" class="org.dataone.cn.indexer.annotation.RdfXmlSubprocessor">
6
	<bean id="rdfXmlSubprocessor" class="edu.ucsb.nceas.metacat.index.annotation.MetacatRdfXmlSubprocessor">
7 7
		<property name="matchDocuments">
8 8
			<list>
9 9
				<value>http://www.w3.org/TR/rdf-syntax-grammar</value>
metacat-index/src/test/java/edu/ucsb/nceas/metacat/index/annotation/MetacatRdfXmlSubprocessorTest.java
1
package edu.ucsb.nceas.metacat.index.annotation;
2

  
3
import static org.junit.Assert.assertTrue;
4

  
5
import java.io.ByteArrayOutputStream;
6
import java.io.File;
7
import java.io.FileInputStream;
8
import java.io.InputStream;
9
import java.util.ArrayList;
10
import java.util.HashMap;
11
import java.util.List;
12
import java.util.Map;
13
import java.util.Set;
14

  
15
import org.dataone.cn.indexer.parser.IDocumentSubprocessor;
16
import org.dataone.cn.indexer.solrhttp.SolrDoc;
17
import org.dataone.cn.indexer.solrhttp.SolrElementField;
18
import org.junit.Test;
19
import org.dataone.cn.indexer.annotation.RdfXmlSubprocessor;
20

  
21
import edu.ucsb.nceas.metacat.index.SolrIndex;
22
import edu.ucsb.nceas.metacat.index.SolrIndexIT;
23

  
24
public class MetacatRdfXmlSubprocessorTest {
25
    
26
    /**
27
     * Test the case that the resource map contains a component which is not int the solr index server.
28
     * @throws Exception
29
     */
30
    @Test
31
    public void testProcessDocument() throws Exception {
32
        //Settings.getConfiguration().setProperty("dataone.hazelcast.configFilePath", "../lib/hazelcast.xml");
33
        String id = "resourceMap_urn:uuid:04780847-6082-455b-9831-22269c9ec0a6";
34
        InputStream is = getResourceMapDoc();
35
        List<SolrElementField> sysSolrFields = new ArrayList<SolrElementField>();
36
        SolrElementField idField = new SolrElementField();
37
        idField.setName("id");
38
        idField.setValue(id);
39
        sysSolrFields.add(idField);
40
        SolrDoc indexDocument = new SolrDoc(sysSolrFields);
41
        Map<String, SolrDoc> docs = new HashMap<String, SolrDoc>();
42
        docs.put(id, indexDocument);
43
        MetacatRdfXmlSubprocessor processor = getMetacatRdfXmlSubprocessor();
44
        
45
        try {
46
            Map<String, SolrDoc> result = processor.processDocument(id, docs, is);
47
            Set<String> ids = result.keySet();
48
            for(String newId: ids) {
49
                SolrDoc resultSolrDoc = result.get(newId);
50
                if(newId.equals("urn:uuid:2c20432e-116a-4085-b8d6-abfc4b2dada2")){
51
                    SolrElementField field1 = resultSolrDoc.getField("wasDerivedFrom");
52
                    assertTrue(" the wasDerivedFrom value should be urn:uuid:621a115f-f1ed-4bef-bca5-f8741793a540. But the real value is "+field1.getValue(), field1.getValue().equals("urn:uuid:621a115f-f1ed-4bef-bca5-f8741793a540"));
53
                    SolrElementField field2 = resultSolrDoc.getField("wasGeneratedBy");
54
                    assertTrue("the wasGeneratedBy value should be urn:uuid:9ceeaeb3-6ef3-4b1e-bc4d-96e299fab3a4. But the real value is"+field2.getValue(), field2.getValue().equals("urn:uuid:9ceeaeb3-6ef3-4b1e-bc4d-96e299fab3a4"));
55
                } else if (newId.equals("urn:uuid:9ceeaeb3-6ef3-4b1e-bc4d-96e299fab3a4")) {
56
                    SolrElementField field1 = resultSolrDoc.getField("used");
57
                    assertTrue(" the used value should be urn:uuid:621a115f-f1ed-4bef-bca5-f8741793a540. But the real value is "+field1.getValue(), field1.getValue().equals("urn:uuid:621a115f-f1ed-4bef-bca5-f8741793a540"));
58
                   
59
                } else if (newId.equals("urn:uuid:621a115f-f1ed-4bef-bca5-f8741793a540")) {
60
                    List<String>list = resultSolrDoc.getAllFieldValues("wasDerivedFrom");
61
                    assertTrue("The list must contain urn:uuid:ee635a61-c930-444d-8214-db65178a1a47", list.contains("urn:uuid:ee635a61-c930-444d-8214-db65178a1a47"));
62
                    assertTrue("The list must contain urn:uuid:23495598-d50b-4317-b0e1-05a9d9e52632", list.contains("urn:uuid:23495598-d50b-4317-b0e1-05a9d9e52632"));
63
                    assertTrue("The list must contain urn:uuid:urn:uuid:672ba6c5-8812-4c05-a324-246af172c67a", list.contains("urn:uuid:672ba6c5-8812-4c05-a324-246af172c67a"));
64
                    assertTrue("The list must contain urn:uuid:e534b2ab-3a1b-44ed-8a99-ce54a0487aea", list.contains("urn:uuid:e534b2ab-3a1b-44ed-8a99-ce54a0487aea"));
65
                    list = resultSolrDoc.getAllFieldValues("wasGeneratedBy");
66
                    assertTrue("The list must contain urn:uuid:d8e46217-2650-42b2-896f-0f006b1a2d3b", list.contains("urn:uuid:d8e46217-2650-42b2-896f-0f006b1a2d3b"));
67
                } else if (newId.equals("urn:uuid:a0e104da-c925-4765-af60-29310de1b99a")) {
68
                    List<String>list = resultSolrDoc.getAllFieldValues("wasGeneratedBy");
69
                    assertTrue("The list must contain urn:uuid:9ceeaeb3-6ef3-4b1e-bc4d-96e299fab3a4", list.contains("urn:uuid:9ceeaeb3-6ef3-4b1e-bc4d-96e299fab3a4"));
70
                }  else if (newId.equals("urn:uuid:d8e46217-2650-42b2-896f-0f006b1a2d3b")) {
71
                    List<String>list = resultSolrDoc.getAllFieldValues("used");
72
                    assertTrue("The list must contain urn:uuid:ee635a61-c930-444d-8214-db65178a1a47", list.contains("urn:uuid:ee635a61-c930-444d-8214-db65178a1a47"));
73
                    assertTrue("The list must contain urn:uuid:23495598-d50b-4317-b0e1-05a9d9e52632", list.contains("urn:uuid:23495598-d50b-4317-b0e1-05a9d9e52632"));
74
                    assertTrue("The list must contain urn:uuid:672ba6c5-8812-4c05-a324-246af172c67a", list.contains("urn:uuid:672ba6c5-8812-4c05-a324-246af172c67a"));
75
                    assertTrue("The list must contain urn:uuid:e534b2ab-3a1b-44ed-8a99-ce54a0487aea", list.contains("urn:uuid:e534b2ab-3a1b-44ed-8a99-ce54a0487aea"));
76
                }
77
                /*ByteArrayOutputStream baos = new ByteArrayOutputStream();
78
                resultSolrDoc.serialize(baos, "UTF-8");
79
                System.out.println("after process, the solr doc is \n"+baos.toString());*/
80
            }
81
            
82
        } catch (Exception e) {
83
            e.printStackTrace();
84
            assertTrue("It shouldn't throw an exception.", false);
85
        }
86
    }
87
    
88
    /*
89
     * Get the document format of the test resource map file 
90
     */
91
    private InputStream getResourceMapDoc() throws Exception{
92
    	File file = new File("src/test/resources/rdfxml-example.xml");
93
        InputStream is = new FileInputStream(file);
94
        return is;
95
    }
96
    
97
    /*
98
     * Get the ResourceMapSubprocessor
99
     */
100
    private MetacatRdfXmlSubprocessor getMetacatRdfXmlSubprocessor() throws Exception {
101
        MetacatRdfXmlSubprocessor resorceMapprocessor = null;
102
        SolrIndex solrIndex = SolrIndexIT.generateSolrIndex();
103
        List<IDocumentSubprocessor> processors = solrIndex.getSubprocessors();
104
        for(IDocumentSubprocessor processor : processors) {
105
            if(processor instanceof MetacatRdfXmlSubprocessor) {
106
                resorceMapprocessor = (MetacatRdfXmlSubprocessor) processor;
107
            }
108
        }
109
        return resorceMapprocessor;
110
    }
111
    
112
   
113
}
metacat-index/src/test/resources/rdfxml-example.xml
1
<?xml version="1.0" encoding="utf-8"?>
2
<rdf:RDF xmlns:cito="http://purl.org/spar/cito/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:ore="http://www.openarchives.org/ore/terms/" xmlns:prov="http://www.w3.org/ns/prov#" xmlns:provone="http://purl.dataone.org/provone/2015/01/15/ontology#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#">
3
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A2c20432e-116a-4085-b8d6-abfc4b2dada2">
4
    <prov:wasGeneratedBy rdf:resource="https://cn.dataone.org/cn/v2/resolve/urn%3Auuid%3A9ceeaeb3-6ef3-4b1e-bc4d-96e299fab3a4"/>
5
  </rdf:Description>
6
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A621a115f-f1ed-4bef-bca5-f8741793a540">
7
    <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">urn:uuid:621a115f-f1ed-4bef-bca5-f8741793a540</dcterms:identifier>
8
  </rdf:Description>
9
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A672ba6c5-8812-4c05-a324-246af172c67a">
10
    <rdf:type rdf:resource="http://purl.dataone.org/provone/2015/01/15/ontology#Data"/>
11
  </rdf:Description>
12
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11">
13
    <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">urn:uuid:21edffcf-70e9-43fb-829d-b5f8644f1a11</dcterms:identifier>
14
  </rdf:Description>
15
  <rdf:Description rdf:about="https://cn.dataone.org/cn/v2/resolve/urn%3Auuid%3A9ceeaeb3-6ef3-4b1e-bc4d-96e299fab3a4">
16
    <prov:used rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A621a115f-f1ed-4bef-bca5-f8741793a540"/>
17
  </rdf:Description>
18
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A621a115f-f1ed-4bef-bca5-f8741793a540">
19
    <prov:wasDerivedFrom rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Aee635a61-c930-444d-8214-db65178a1a47"/>
20
  </rdf:Description>
21
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A621a115f-f1ed-4bef-bca5-f8741793a540">
22
    <prov:wasDerivedFrom rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae534b2ab-3a1b-44ed-8a99-ce54a0487aea"/>
23
  </rdf:Description>
24
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A621a115f-f1ed-4bef-bca5-f8741793a540">
25
    <prov:wasDerivedFrom rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A672ba6c5-8812-4c05-a324-246af172c67a"/>
26
  </rdf:Description>
27
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A621a115f-f1ed-4bef-bca5-f8741793a540">
28
    <prov:wasDerivedFrom rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A23495598-d50b-4317-b0e1-05a9d9e52632"/>
29
  </rdf:Description>
30
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae534b2ab-3a1b-44ed-8a99-ce54a0487aea">
31
    <ore:isAggregatedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation"/>
32
  </rdf:Description>
33
  <rdf:Description rdf:about="https://cn.dataone.org/cn/v2/resolve/urn%3Auuid%3Ad8e46217-2650-42b2-896f-0f006b1a2d3b">
34
    <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">urn:uuid:d8e46217-2650-42b2-896f-0f006b1a2d3b</dcterms:identifier>
35
  </rdf:Description>
36
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Aee635a61-c930-444d-8214-db65178a1a47">
37
    <cito:isDocumentedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11"/>
38
  </rdf:Description>
39
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Aee635a61-c930-444d-8214-db65178a1a47">
40
    <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">urn:uuid:ee635a61-c930-444d-8214-db65178a1a47</dcterms:identifier>
41
  </rdf:Description>
42
  <rdf:Description rdf:about="https://cn.dataone.org/cn/v2/resolve/urn%3Auuid%3A9ceeaeb3-6ef3-4b1e-bc4d-96e299fab3a4">
43
    <prov:qualifiedAssociation rdf:nodeID="_:1f552b34-893e-4b1d-8aaf-e6293c997ff4"/>
44
  </rdf:Description>
45
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294">
46
    <ore:describes rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation"/>
47
  </rdf:Description>
48
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae534b2ab-3a1b-44ed-8a99-ce54a0487aea">
49
    <rdf:type rdf:resource="http://purl.dataone.org/provone/2015/01/15/ontology#Data"/>
50
  </rdf:Description>
51
  <rdf:Description rdf:nodeID="_:1f552b34-893e-4b1d-8aaf-e6293c997ff4">
52
    <prov:hadPlan rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A4c9d9509-4772-4131-9aec-9a9d5ccd8f8a"/>
53
  </rdf:Description>
54
  <rdf:Description rdf:about="https://cn.dataone.org/cn/v2/resolve/urn%3Auuid%3Ad8e46217-2650-42b2-896f-0f006b1a2d3b">
55
    <prov:qualifiedAssociation rdf:nodeID="_:5787d51f-f7ae-4dcd-9cce-107c55a17b10"/>
56
  </rdf:Description>
57
  <rdf:Description rdf:about="https://cn.dataone.org/cn/v2/resolve/urn%3Auuid%3A9ceeaeb3-6ef3-4b1e-bc4d-96e299fab3a4">
58
    <rdf:type rdf:resource="http://purl.dataone.org/provone/2015/01/15/ontology#Execution"/>
59
  </rdf:Description>
60
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ad2fcd5c0-2755-411e-b969-0b5f8eb47d75">
61
    <cito:isDocumentedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11"/>
62
  </rdf:Description>
63
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Aa0e104da-c925-4765-af60-29310de1b99a">
64
    <rdf:type rdf:resource="http://purl.dataone.org/provone/2015/01/15/ontology#Data"/>
65
  </rdf:Description>
66
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A23495598-d50b-4317-b0e1-05a9d9e52632">
67
    <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">urn:uuid:23495598-d50b-4317-b0e1-05a9d9e52632</dcterms:identifier>
68
  </rdf:Description>
69
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11">
70
    <cito:documents rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Aee635a61-c930-444d-8214-db65178a1a47"/>
71
  </rdf:Description>
72
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11">
73
    <cito:documents rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae534b2ab-3a1b-44ed-8a99-ce54a0487aea"/>
74
  </rdf:Description>
75
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11">
76
    <cito:documents rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ad2fcd5c0-2755-411e-b969-0b5f8eb47d75"/>
77
  </rdf:Description>
78
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11">
79
    <cito:documents rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Abf29d4cb-d06e-4e2b-a722-e1f9a98f2263"/>
80
  </rdf:Description>
81
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11">
82
    <cito:documents rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Aa0e104da-c925-4765-af60-29310de1b99a"/>
83
  </rdf:Description>
84
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11">
85
    <cito:documents rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A672ba6c5-8812-4c05-a324-246af172c67a"/>
86
  </rdf:Description>
87
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11">
88
    <cito:documents rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A621a115f-f1ed-4bef-bca5-f8741793a540"/>
89
  </rdf:Description>
90
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11">
91
    <cito:documents rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A4c9d9509-4772-4131-9aec-9a9d5ccd8f8a"/>
92
  </rdf:Description>
93
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11">
94
    <cito:documents rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A2c20432e-116a-4085-b8d6-abfc4b2dada2"/>
95
  </rdf:Description>
96
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11">
97
    <cito:documents rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A23495598-d50b-4317-b0e1-05a9d9e52632"/>
98
  </rdf:Description>
99
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11">
100
    <cito:documents rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11"/>
101
  </rdf:Description>
102
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A2c20432e-116a-4085-b8d6-abfc4b2dada2">
103
    <rdf:type rdf:resource="http://purl.dataone.org/provone/2015/01/15/ontology#Data"/>
104
  </rdf:Description>
105
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A23495598-d50b-4317-b0e1-05a9d9e52632">
106
    <rdf:type rdf:resource="http://purl.dataone.org/provone/2015/01/15/ontology#Data"/>
107
  </rdf:Description>
108
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A4c9d9509-4772-4131-9aec-9a9d5ccd8f8a">
109
    <ore:isAggregatedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation"/>
110
  </rdf:Description>
111
  <rdf:Description rdf:about="https://cn.dataone.org/cn/v2/resolve/urn%3Auuid%3Ad8e46217-2650-42b2-896f-0f006b1a2d3b">
112
    <rdf:type rdf:resource="http://purl.dataone.org/provone/2015/01/15/ontology#Execution"/>
113
  </rdf:Description>
114
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae534b2ab-3a1b-44ed-8a99-ce54a0487aea">
115
    <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">urn:uuid:e534b2ab-3a1b-44ed-8a99-ce54a0487aea</dcterms:identifier>
116
  </rdf:Description>
117
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Aa0e104da-c925-4765-af60-29310de1b99a">
118
    <prov:wasGeneratedBy rdf:resource="https://cn.dataone.org/cn/v2/resolve/urn%3Auuid%3A9ceeaeb3-6ef3-4b1e-bc4d-96e299fab3a4"/>
119
  </rdf:Description>
120
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Aee635a61-c930-444d-8214-db65178a1a47">
121
    <rdf:type rdf:resource="http://purl.dataone.org/provone/2015/01/15/ontology#Data"/>
122
  </rdf:Description>
123
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A621a115f-f1ed-4bef-bca5-f8741793a540">
124
    <cito:isDocumentedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11"/>
125
  </rdf:Description>
126
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Aee635a61-c930-444d-8214-db65178a1a47">
127
    <ore:isAggregatedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation"/>
128
  </rdf:Description>
129
  <rdf:Description rdf:about="https://cn.dataone.org/cn/v2/resolve/urn%3Auuid%3Ad8e46217-2650-42b2-896f-0f006b1a2d3b">
130
    <prov:used rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Aee635a61-c930-444d-8214-db65178a1a47"/>
131
  </rdf:Description>
132
  <rdf:Description rdf:about="https://cn.dataone.org/cn/v2/resolve/urn%3Auuid%3Ad8e46217-2650-42b2-896f-0f006b1a2d3b">
133
    <prov:used rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae534b2ab-3a1b-44ed-8a99-ce54a0487aea"/>
134
  </rdf:Description>
135
  <rdf:Description rdf:about="https://cn.dataone.org/cn/v2/resolve/urn%3Auuid%3Ad8e46217-2650-42b2-896f-0f006b1a2d3b">
136
    <prov:used rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A672ba6c5-8812-4c05-a324-246af172c67a"/>
137
  </rdf:Description>
138
  <rdf:Description rdf:about="https://cn.dataone.org/cn/v2/resolve/urn%3Auuid%3Ad8e46217-2650-42b2-896f-0f006b1a2d3b">
139
    <prov:used rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A23495598-d50b-4317-b0e1-05a9d9e52632"/>
140
  </rdf:Description>
141
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294">
142
    <rdf:type rdf:resource="http://www.openarchives.org/ore/terms/ResourceMap"/>
143
  </rdf:Description>
144
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ad2fcd5c0-2755-411e-b969-0b5f8eb47d75">
145
    <rdf:type rdf:resource="http://purl.dataone.org/provone/2015/01/15/ontology#Program"/>
146
  </rdf:Description>
147
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A2c20432e-116a-4085-b8d6-abfc4b2dada2">
148
    <cito:isDocumentedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11"/>
149
  </rdf:Description>
150
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A672ba6c5-8812-4c05-a324-246af172c67a">
151
    <cito:isDocumentedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11"/>
152
  </rdf:Description>
153
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Abf29d4cb-d06e-4e2b-a722-e1f9a98f2263">
154
    <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">urn:uuid:bf29d4cb-d06e-4e2b-a722-e1f9a98f2263</dcterms:identifier>
155
  </rdf:Description>
156
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A621a115f-f1ed-4bef-bca5-f8741793a540">
157
    <prov:wasGeneratedBy rdf:resource="https://cn.dataone.org/cn/v2/resolve/urn%3Auuid%3Ad8e46217-2650-42b2-896f-0f006b1a2d3b"/>
158
  </rdf:Description>
159
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Abf29d4cb-d06e-4e2b-a722-e1f9a98f2263">
160
    <cito:isDocumentedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11"/>
161
  </rdf:Description>
162
  <rdf:Description rdf:nodeID="_:1f552b34-893e-4b1d-8aaf-e6293c997ff4">
163
    <rdf:type rdf:resource="http://www.w3.org/ns/prov#Association"/>
164
  </rdf:Description>
165
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A4c9d9509-4772-4131-9aec-9a9d5ccd8f8a">
166
    <cito:isDocumentedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11"/>
167
  </rdf:Description>
168
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Abf29d4cb-d06e-4e2b-a722-e1f9a98f2263">
169
    <ore:isAggregatedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation"/>
170
  </rdf:Description>
171
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A4c9d9509-4772-4131-9aec-9a9d5ccd8f8a">
172
    <rdf:type rdf:resource="http://purl.dataone.org/provone/2015/01/15/ontology#Program"/>
173
  </rdf:Description>
174
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A2c20432e-116a-4085-b8d6-abfc4b2dada2">
175
    <prov:wasDerivedFrom rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A621a115f-f1ed-4bef-bca5-f8741793a540"/>
176
  </rdf:Description>
177
  <rdf:Description rdf:nodeID="_:5787d51f-f7ae-4dcd-9cce-107c55a17b10">
178
    <rdf:type rdf:resource="http://www.w3.org/ns/prov#Association"/>
179
  </rdf:Description>
180
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A672ba6c5-8812-4c05-a324-246af172c67a">
181
    <ore:isAggregatedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation"/>
182
  </rdf:Description>
183
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Aa0e104da-c925-4765-af60-29310de1b99a">
184
    <cito:isDocumentedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11"/>
185
  </rdf:Description>
186
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A2c20432e-116a-4085-b8d6-abfc4b2dada2">
187
    <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">urn:uuid:2c20432e-116a-4085-b8d6-abfc4b2dada2</dcterms:identifier>
188
  </rdf:Description>
189
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A621a115f-f1ed-4bef-bca5-f8741793a540">
190
    <rdf:type rdf:resource="http://purl.dataone.org/provone/2015/01/15/ontology#Data"/>
191
  </rdf:Description>
192
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A23495598-d50b-4317-b0e1-05a9d9e52632">
193
    <cito:isDocumentedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11"/>
194
  </rdf:Description>
195
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A23495598-d50b-4317-b0e1-05a9d9e52632">
196
    <ore:isAggregatedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation"/>
197
  </rdf:Description>
198
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A4c9d9509-4772-4131-9aec-9a9d5ccd8f8a">
199
    <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">urn:uuid:4c9d9509-4772-4131-9aec-9a9d5ccd8f8a</dcterms:identifier>
200
  </rdf:Description>
201
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ad2fcd5c0-2755-411e-b969-0b5f8eb47d75">
202
    <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">urn:uuid:d2fcd5c0-2755-411e-b969-0b5f8eb47d75</dcterms:identifier>
203
  </rdf:Description>
204
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11">
205
    <ore:isAggregatedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation"/>
206
  </rdf:Description>
207
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation">
208
    <ore:aggregates rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Aee635a61-c930-444d-8214-db65178a1a47"/>
209
  </rdf:Description>
210
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation">
211
    <ore:aggregates rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae534b2ab-3a1b-44ed-8a99-ce54a0487aea"/>
212
  </rdf:Description>
213
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation">
214
    <ore:aggregates rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ad2fcd5c0-2755-411e-b969-0b5f8eb47d75"/>
215
  </rdf:Description>
216
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation">
217
    <ore:aggregates rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Abf29d4cb-d06e-4e2b-a722-e1f9a98f2263"/>
218
  </rdf:Description>
219
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation">
220
    <ore:aggregates rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Aa0e104da-c925-4765-af60-29310de1b99a"/>
221
  </rdf:Description>
222
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation">
223
    <ore:aggregates rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A672ba6c5-8812-4c05-a324-246af172c67a"/>
224
  </rdf:Description>
225
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation">
226
    <ore:aggregates rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A621a115f-f1ed-4bef-bca5-f8741793a540"/>
227
  </rdf:Description>
228
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation">
229
    <ore:aggregates rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A4c9d9509-4772-4131-9aec-9a9d5ccd8f8a"/>
230
  </rdf:Description>
231
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation">
232
    <ore:aggregates rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A2c20432e-116a-4085-b8d6-abfc4b2dada2"/>
233
  </rdf:Description>
234
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation">
235
    <ore:aggregates rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A23495598-d50b-4317-b0e1-05a9d9e52632"/>
236
  </rdf:Description>
237
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation">
238
    <ore:aggregates rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11"/>
239
  </rdf:Description>
240
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae534b2ab-3a1b-44ed-8a99-ce54a0487aea">
241
    <cito:isDocumentedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11"/>
242
  </rdf:Description>
243
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation">
244
    <dc:title>DataONE Aggregation</dc:title>
245
  </rdf:Description>
246
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Aa0e104da-c925-4765-af60-29310de1b99a">
247
    <ore:isAggregatedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation"/>
248
  </rdf:Description>
249
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A621a115f-f1ed-4bef-bca5-f8741793a540">
250
    <ore:isAggregatedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation"/>
251
  </rdf:Description>
252
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A2c20432e-116a-4085-b8d6-abfc4b2dada2">
253
    <ore:isAggregatedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation"/>
254
  </rdf:Description>
255
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation">
256
    <rdf:type rdf:resource="http://www.openarchives.org/ore/terms/Aggregation"/>
257
  </rdf:Description>
258
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A672ba6c5-8812-4c05-a324-246af172c67a">
259
    <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">urn:uuid:672ba6c5-8812-4c05-a324-246af172c67a</dcterms:identifier>
260
  </rdf:Description>
261
  <rdf:Description rdf:nodeID="_:5787d51f-f7ae-4dcd-9cce-107c55a17b10">
262
    <prov:hadPlan rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ad2fcd5c0-2755-411e-b969-0b5f8eb47d75"/>
263
  </rdf:Description>
264
  <rdf:Description rdf:about="https://cn.dataone.org/cn/v2/resolve/urn%3Auuid%3A9ceeaeb3-6ef3-4b1e-bc4d-96e299fab3a4">
265
    <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">urn:uuid:9ceeaeb3-6ef3-4b1e-bc4d-96e299fab3a4</dcterms:identifier>
266
  </rdf:Description>
267
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Aa0e104da-c925-4765-af60-29310de1b99a">
268
    <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">urn:uuid:a0e104da-c925-4765-af60-29310de1b99a</dcterms:identifier>
269
  </rdf:Description>
270
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ad2fcd5c0-2755-411e-b969-0b5f8eb47d75">
271
    <ore:isAggregatedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294#aggregation"/>
272
  </rdf:Description>
273
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3Ae029b6e4-be07-442b-a54e-2d0aca657294">
274
    <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">urn:uuid:e029b6e4-be07-442b-a54e-2d0aca657294</dcterms:identifier>
275
  </rdf:Description>
276
  <rdf:Description rdf:about="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11">
277
    <cito:isDocumentedBy rdf:resource="https://cn-stage-2.test.dataone.org/cn/v2/resolve/urn%3Auuid%3A21edffcf-70e9-43fb-829d-b5f8644f1a11"/>
278
  </rdf:Description>
279
</rdf:RDF>

Also available in: Unified diff