From 31f146b1cdcdc79d1d62429a8237d5f2bb382330 Mon Sep 17 00:00:00 2001 From: jo-pol Date: Tue, 8 Apr 2025 13:16:25 +0200 Subject: [PATCH 001/470] 500->409 for concurrent updates --- .../edu/harvard/iq/dataverse/api/Datasets.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index 516904f17a6..f754341a36b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -66,6 +66,7 @@ import jakarta.ws.rs.container.ContainerRequestContext; import jakarta.ws.rs.core.*; import jakarta.ws.rs.core.Response.Status; +import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.commons.lang3.StringUtils; import org.eclipse.microprofile.openapi.annotations.Operation; import org.eclipse.microprofile.openapi.annotations.media.Content; @@ -102,7 +103,6 @@ import edu.harvard.iq.dataverse.engine.command.exception.PermissionException; import edu.harvard.iq.dataverse.dataset.DatasetType; import edu.harvard.iq.dataverse.dataset.DatasetTypeServiceBean; - import static edu.harvard.iq.dataverse.util.json.JsonPrinter.*; import static edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder.jsonObjectBuilder; @@ -2059,6 +2059,10 @@ public Response createAssignment(@Context ContainerRequestContext crc, RoleAssig return ok( json(execCommand(new AssignRoleCommand(assignee, theRole, dataset, createDataverseRequest(getRequestUser(crc)), privateUrlToken)))); } catch (WrappedResponse ex) { + if (ExceptionUtils.getRootCause(ex).getMessage().contains("duplicate key")) { + // concurrent update + return error(Status.CONFLICT, BundleUtil.getStringFromBundle("datasets.api.grant.role.assignee.has.role.error")); + } List args = Arrays.asList(ex.getMessage()); logger.log(Level.WARNING, BundleUtil.getStringFromBundle("datasets.api.grant.role.cant.create.assignment.error", args)); return ex.getResponse(); @@ -2964,7 +2968,7 @@ public Response getCompareVersions(@Context ContainerRequestContext crc, @PathPa return wr.getResponse(); } } - + @GET @AuthRequired @Path("{id}/versions/compareSummary") @@ -3020,7 +3024,7 @@ public Response getCompareVersionsSummary(@Context ContainerRequestContext crc, return wr.getResponse(); } } - + private JsonObject getDeaccessionJson(DatasetVersion dv) { JsonObjectBuilder compositionBuilder = Json.createObjectBuilder(); @@ -3036,7 +3040,7 @@ private JsonObject getDeaccessionJson(DatasetVersion dv) { JsonObject json = Json.createObjectBuilder() .add("deaccessioned", compositionBuilder) .build(); - + return json; } @@ -4454,7 +4458,7 @@ public Response monitorGlobusDownload(@Context ContainerRequestContext crc, @Pat return badRequest("Error parsing json body"); } - + // Async Call globusService.globusDownload(jsonObject, dataset, authUser); @@ -4957,7 +4961,7 @@ public Response getDatasetVersionInternalCitation(@Context ContainerRequestConte } } - /** + /** * Returns one of the DataCitation.Format types as a raw file download (not wrapped in our ok json) * @param crc * @param datasetId @@ -5533,7 +5537,7 @@ public Response addVersionNote(@Context ContainerRequestContext crc, @PathParam( @Path("{id}/versions/{versionId}/versionNote") public Response deleteVersionNote(@Context ContainerRequestContext crc, @PathParam("id") String datasetId, @PathParam("versionId") String versionId, @Context UriInfo uriInfo, @Context HttpHeaders headers) throws WrappedResponse { if(!FeatureFlags.VERSION_NOTE.enabled()) { - return notFound(BundleUtil.getStringFromBundle("datasets.api.addVersionNote.notEnabled")); + return notFound(BundleUtil.getStringFromBundle("datasets.api.addVersionNote.notEnabled")); } if (!DS_VERSION_DRAFT.equals(versionId)) { AuthenticatedUser user = getRequestAuthenticatedUserOrDie(crc); From 9245a168fcdef4b7e06d980390a528aa55039a99 Mon Sep 17 00:00:00 2001 From: jo-pol Date: Tue, 15 Apr 2025 10:54:40 +0200 Subject: [PATCH 002/470] error handling cvoc filters --- .../iq/dataverse/DatasetFieldServiceBean.java | 134 ++++++++++-------- 1 file changed, 78 insertions(+), 56 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java index 58945ebed20..88e430ae046 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java @@ -20,6 +20,7 @@ import java.util.Set; import java.util.logging.Logger; +import com.google.gson.GsonBuilder; import jakarta.ejb.EJB; import jakarta.ejb.Stateless; import jakarta.inject.Named; @@ -64,31 +65,31 @@ public class DatasetFieldServiceBean implements java.io.Serializable { @PersistenceContext(unitName = "VDCNet-ejbPU") private EntityManager em; - + private static final Logger logger = Logger.getLogger(DatasetFieldServiceBean.class.getCanonicalName()); @EJB SettingsServiceBean settingsService; private static final String NAME_QUERY = "SELECT dsfType from DatasetFieldType dsfType where dsfType.name= :fieldName"; - + /* * External vocabulary support: These fields cache information from the CVocConf * setting which controls how Dataverse connects specific metadata block fields * to third-party Javascripts and external vocabulary services to allow users to * input values from a vocabulary(ies) those services manage. */ - - //Configuration json keyed by the id of the 'parent' DatasetFieldType + + //Configuration json keyed by the id of the 'parent' DatasetFieldType Map cvocMap = null; - + //Configuration json keyed by the id of the child DatasetFieldType specified as the 'term-uri-field' //Note that for primitive fields, the prent and term-uri-field are the same and these maps have the same entry Map cvocMapByTermUri = null; - + //Flat list of cvoc term-uri and managed fields by Id Set cvocFieldSet = null; - + //The hash of the existing CVocConf setting. Used to determine when the setting has changed and it needs to be re-parsed to recreate the cvocMaps String oldHash = null; @@ -98,7 +99,7 @@ public List findAllAdvancedSearchFieldTypes() { public List findAllFacetableFieldTypes() { return em.createNamedQuery("DatasetFieldType.findAllFacetable", DatasetFieldType.class) - .getResultList(); + .getResultList(); } public List findFacetableFieldTypesByMetadataBlock(Long metadataBlockId) { @@ -129,7 +130,7 @@ public DatasetFieldType findByName(String name) { } catch (NoResultException e) { return null; } - + } /** @@ -150,11 +151,11 @@ public DatasetFieldType findByNameOpt(String name) { } } - /* + /* * Similar method for looking up foreign metadata field mappings, for metadata - * imports. for these the uniquness of names isn't guaranteed (i.e., there - * can be a field "author" in many different formats that we want to support), - * so these have to be looked up by both the field name and the name of the + * imports. for these the uniquness of names isn't guaranteed (i.e., there + * can be a field "author" in many different formats that we want to support), + * so these have to be looked up by both the field name and the name of the * foreign format. */ public ForeignMetadataFieldMapping findFieldMapping(String formatName, String pathName) { @@ -172,7 +173,7 @@ public ForeignMetadataFieldMapping findFieldMapping(String formatName, String pa public ControlledVocabularyValue findControlledVocabularyValue(Object pk) { return em.find(ControlledVocabularyValue.class, pk); } - + /** * @param dsft The DatasetFieldType in which to look up a * ControlledVocabularyValue. @@ -183,7 +184,7 @@ public ControlledVocabularyValue findControlledVocabularyValue(Object pk) { * @return The ControlledVocabularyValue found or null. */ public ControlledVocabularyValue findControlledVocabularyValueByDatasetFieldTypeAndStrValue(DatasetFieldType dsft, String strValue, boolean lenient) { - TypedQuery typedQuery = em.createQuery("SELECT OBJECT(o) FROM ControlledVocabularyValue AS o WHERE o.strValue = :strvalue AND o.datasetFieldType = :dsft", ControlledVocabularyValue.class); + TypedQuery typedQuery = em.createQuery("SELECT OBJECT(o) FROM ControlledVocabularyValue AS o WHERE o.strValue = :strvalue AND o.datasetFieldType = :dsft", ControlledVocabularyValue.class); typedQuery.setParameter("strvalue", strValue); typedQuery.setParameter("dsft", dsft); try { @@ -202,7 +203,7 @@ public ControlledVocabularyValue findControlledVocabularyValueByDatasetFieldType } } } - + public ControlledVocabAlternate findControlledVocabAlternateByControlledVocabularyValueAndStrValue(ControlledVocabularyValue cvv, String strValue){ TypedQuery typedQuery = em.createQuery("SELECT OBJECT(o) FROM ControlledVocabAlternate AS o WHERE o.strValue = :strvalue AND o.controlledVocabularyValue = :cvv", ControlledVocabAlternate.class); typedQuery.setParameter("strvalue", strValue); @@ -217,7 +218,7 @@ public ControlledVocabAlternate findControlledVocabAlternateByControlledVocabula return (ControlledVocabAlternate) results.get(0); } } - + /** * @param dsft The DatasetFieldType in which to look up a * ControlledVocabularyValue. @@ -227,7 +228,7 @@ public ControlledVocabAlternate findControlledVocabAlternateByControlledVocabula * @return The ControlledVocabularyValue found or null. */ public ControlledVocabularyValue findControlledVocabularyValueByDatasetFieldTypeAndIdentifier (DatasetFieldType dsft, String identifier) { - TypedQuery typedQuery = em.createQuery("SELECT OBJECT(o) FROM ControlledVocabularyValue AS o WHERE o.identifier = :identifier AND o.datasetFieldType = :dsft", ControlledVocabularyValue.class); + TypedQuery typedQuery = em.createQuery("SELECT OBJECT(o) FROM ControlledVocabularyValue AS o WHERE o.identifier = :identifier AND o.datasetFieldType = :dsft", ControlledVocabularyValue.class); typedQuery.setParameter("identifier", identifier); typedQuery.setParameter("dsft", dsft); try { @@ -256,11 +257,11 @@ public MetadataBlock save(MetadataBlock mdb) { public ControlledVocabularyValue save(ControlledVocabularyValue cvv) { return em.merge(cvv); } - + public ControlledVocabAlternate save(ControlledVocabAlternate alt) { return em.merge(alt); - } - + } + /** * This method returns a Map relating DatasetFieldTypes with any external @@ -270,14 +271,14 @@ public ControlledVocabAlternate save(ControlledVocabAlternate alt) { * id or of the child field specified as the 'term-uri-field' (the field where * the URI of the term is stored (and not one of the child fields where the term * name, vocabulary URI, vocabulary Name or other managed information may go.) - * + * * The map only contains values for DatasetFieldTypes that are configured to use external vocabulary services. - * + * * @param byTermUriField - false: the id of the parent DatasetFieldType is the key, true: the 'term-uri-field' DatasetFieldType id is used as the key * @return - a map of JsonObjects containing configuration information keyed by the DatasetFieldType id (Long) */ public Map getCVocConf(boolean byTermUriField){ - + //ToDo - change to an API call to be able to provide feedback if the json is invalid? String cvocSetting = settingsService.getValueForKey(SettingsServiceBean.Key.CVocConf); if (cvocSetting == null || cvocSetting.isEmpty()) { @@ -291,12 +292,12 @@ public Map getCVocConf(boolean byTermUriField){ String newHash = DigestUtils.md5Hex(cvocSetting); if (newHash.equals(oldHash)) { return byTermUriField ? cvocMapByTermUri : cvocMap; - } + } oldHash=newHash; cvocMap=new HashMap<>(); cvocMapByTermUri=new HashMap<>(); cvocFieldSet = new HashSet<>(); - + try (JsonReader jsonReader = Json.createReader(new StringReader(settingsService.getValueForKey(SettingsServiceBean.Key.CVocConf)))) { JsonArray cvocConfJsonArray = jsonReader.readArray(); for (JsonObject jo : cvocConfJsonArray.getValuesAs(JsonObject.class)) { @@ -649,6 +650,7 @@ private JsonObject filterResponse(JsonObject cvocEntry, JsonObject readObject, S logger.fine("RF: " + filtering.toString()); JsonObject managedFields = cvocEntry.getJsonObject("managed-fields"); logger.fine("MF: " + managedFields.toString()); + int nrOfNoutFound = 0; for (String filterKey : filtering.keySet()) { if (!filterKey.equals("@context")) { try { @@ -667,9 +669,14 @@ private JsonObject filterResponse(JsonObject cvocEntry, JsonObject readObject, S param = param.substring(1); String[] pathParts = param.split("/"); logger.fine("PP: " + String.join(", ", pathParts)); - JsonValue curPath = readObject; - vals.add(i, processPathSegment(0, pathParts, curPath, termUri)); - logger.fine("Added param value: " + i + ": " + vals.get(i)); + var foundPart = processPathSegment(0, pathParts, readObject, termUri); + if (foundPart == null) { + nrOfNoutFound ++ ; + logger.warning("External Vocabulary: no value found for %s - %s".formatted(filterKey, param)); + } else { + vals.add(i, foundPart); + logger.fine("Added param value: " + i + ": " + vals.get(i)); + } } else { logger.fine("Param is: " + param); // param is not a path - either a reference to the term URI @@ -692,19 +699,24 @@ private JsonObject filterResponse(JsonObject cvocEntry, JsonObject readObject, S logger.fine("Added #id pattern: " + filterKey + ": " + termUri); job.add(filterKey, termUri); } else if (pattern.contains("{")) { - if (pattern.equals("{0}")) { - if (vals.get(0) instanceof JsonArray) { - job.add(filterKey, (JsonArray) vals.get(0)); - } else if (vals.get(0) instanceof JsonObject) { - job.add(filterKey, (JsonObject) vals.get(0)); - } else { - job.add(filterKey, (String) vals.get(0)); + if (!vals.isEmpty()) { + if (pattern.equals("{0}")) { + if (vals.get(0) instanceof JsonArray) { + job.add(filterKey, (JsonArray) vals.get(0)); + } + else if (vals.get(0) instanceof JsonObject) { + job.add(filterKey, (JsonObject) vals.get(0)); + } + else { + job.add(filterKey, (String) vals.get(0)); + } + } + else { + String result = MessageFormat.format(pattern, vals.toArray()); + logger.fine("Result: " + result); + job.add(filterKey, result); + logger.fine("Added : " + filterKey + ": " + result); } - } else { - String result = MessageFormat.format(pattern, vals.toArray()); - logger.fine("Result: " + result); - job.add(filterKey, result); - logger.fine("Added : " + filterKey + ": " + result); } } else { logger.fine("Added hardcoded pattern: " + filterKey + ": " + pattern); @@ -717,6 +729,9 @@ private JsonObject filterResponse(JsonObject cvocEntry, JsonObject readObject, S } } } + if(nrOfNoutFound>0) { + logger.warning("External Vocabulary: " + termUri + " - Failed to find value(s) reported above in " +readObject); + } JsonObject filteredResponse = job.build(); if(filteredResponse.isEmpty()) { logger.severe("Unable to filter response for term: " + termUri + ", received: " + readObject.toString()); @@ -741,13 +756,16 @@ Object processPathSegment(int index, String[] pathParts, JsonValue curPath, Stri } for (int k = 0; k < arr.size(); k++) { JsonObject jo = arr.getJsonObject(k); - String val = jo.getString(keyVal[0]); - if (val.equals(expected)) { - logger.fine("Found: " + jo.toString()); - curPath = jo; - return processPathSegment(index + 1, pathParts, curPath, termUri); + if (!jo.isEmpty()) { + JsonValue val = jo.get(keyVal[0]); + if (val != null && val.getValueType() == ValueType.STRING && val.toString().equals(expected)) { + logger.fine("Found: " + jo.toString()); + curPath = jo; + return processPathSegment(index + 1, pathParts, curPath, termUri); + } } } + return null; } else { JsonArrayBuilder parts = Json.createArrayBuilder(); for (JsonValue subPath : arr) { @@ -773,26 +791,30 @@ Object processPathSegment(int index, String[] pathParts, JsonValue curPath, Stri logger.fine("Last segment: " + curPath.toString()); logger.fine("Looking for : " + pathParts[index]); JsonValue jv = ((JsonObject) curPath).get(pathParts[index]); - ValueType type =jv.getValueType(); - if (type.equals(JsonValue.ValueType.STRING)) { - return ((JsonString) jv).getString(); - } else if (jv.getValueType().equals(JsonValue.ValueType.ARRAY)) { - return jv; - } else if (jv.getValueType().equals(JsonValue.ValueType.OBJECT)) { - return jv; + if (jv != null) { + ValueType type = jv.getValueType(); + if (type.equals(ValueType.STRING)) { + return ((JsonString) jv).getString(); + } + else if (jv.getValueType().equals(ValueType.ARRAY)) { + return jv; + } + else if (jv.getValueType().equals(ValueType.OBJECT)) { + return jv; + } } } return null; } - + /** * Supports validation of externally controlled values. If the value is a URI it * must be in the namespace (start with) one of the uriSpace values of an * allowed vocabulary. If free text entries are allowed for this field (per the * configuration), non-uri entries are also assumed valid. - * + * * @param dft * @param value * @return - true: valid @@ -824,7 +846,7 @@ public boolean isValidCVocValue(DatasetFieldType dft, String value) { } return valid; } - + public List getVocabScripts( Map cvocConf) { //ToDo - only return scripts that are needed (those fields are set on display pages, those blocks/fields are allowed in the Dataverse collection for create/edit)? Set scripts = new HashSet(); From 9baf2d52f48b875e8691e4b8325289049ac11080 Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Fri, 18 Apr 2025 14:52:11 -0400 Subject: [PATCH 003/470] File Metadata Update --- .../11392-edit-file-metadata-empty-values.md | 11 ++ doc/sphinx-guides/source/api/changelog.rst | 1 + doc/sphinx-guides/source/api/native-api.rst | 31 +++++ .../edu/harvard/iq/dataverse/api/Files.java | 67 ++++++++++ .../datasetutility/OptionalFileParams.java | 68 +++------- .../edu/harvard/iq/dataverse/api/FilesIT.java | 123 ++++++++++++++++++ .../edu/harvard/iq/dataverse/api/UtilIT.java | 11 +- .../OptionalFileParamsTest.java | 7 +- 8 files changed, 265 insertions(+), 54 deletions(-) create mode 100644 doc/release-notes/11392-edit-file-metadata-empty-values.md diff --git a/doc/release-notes/11392-edit-file-metadata-empty-values.md b/doc/release-notes/11392-edit-file-metadata-empty-values.md new file mode 100644 index 00000000000..66059444e4f --- /dev/null +++ b/doc/release-notes/11392-edit-file-metadata-empty-values.md @@ -0,0 +1,11 @@ +### Edit File Metadata empty values should clear data + +Previously the API POST /files/{id}/metadata would ignore fields with empty values. Now the API updates the fields with the empty values essentially clearing the data. Missing fields will still be ignored. + +This feature also adds a new version of the POST endpoint (/files/{id}/metadata/version/{datasetVersion}) to specify the dataset version to make the file metadata change to. + +datasetVersion can either be the actual ID (12345) or the friendly version (1.0) + +Note that certain fields (i.e. dataFileTags) are not versioned and changes to these will update the published as well as draft versions of the file. + +See also [the guides](https://dataverse-guide--11359.org.readthedocs.build/en/11359/api/native-api.html#updating-file-metadata), #11392, and #11359. diff --git a/doc/sphinx-guides/source/api/changelog.rst b/doc/sphinx-guides/source/api/changelog.rst index 9bcf0cbfaa6..ddef58cd9fa 100644 --- a/doc/sphinx-guides/source/api/changelog.rst +++ b/doc/sphinx-guides/source/api/changelog.rst @@ -11,6 +11,7 @@ v6.7 ---- - An undocumented :doc:`search` parameter called "show_my_data" has been removed. It was never exercised by tests and is believed to be unused. API users should use the :ref:`api-mydata` API instead. +- For POST /api/files/{id}/metadata passing an empty string (“description”:””) or array (“categories”:[]) will no longer be ignored. Empty fields will now clear out the values in the file's metadata. To ignore the fields simply do not include them in the Json string. v6.6 ---- diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index 95041ab5304..aba31670aa1 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -4612,6 +4612,10 @@ Updating File Metadata Updates the file metadata for an existing file where ``ID`` is the database id of the file to update or ``PERSISTENT_ID`` is the persistent id (DOI or Handle) of the file. Requires a ``jsonString`` expressing the new metadata. No metadata from the previous version of this file will be persisted, so if you want to update a specific field first get the json with the above command and alter the fields you want. +An extended version of this API will allow for the Dataset Version ID to be specified in order to modify fields of a Datafile in an already published version of the Dataset. + +Note: As of Dataverse 6.7 passing in an empty value for a string field ("description":"") or an empty array for a list ("categories":[]) will clear the data for that field. In prior versions these fields would be ignored. To ignore the fields simply leave them out of the ``jsonString``. + A curl example using an ``ID`` .. code-block:: bash @@ -4656,6 +4660,33 @@ Note: To update the 'tabularTags' property of file metadata, use the 'dataFileTa Also note that dataFileTags are not versioned and changes to these will update the published version of the file. +Extended version of the API: + +This extended version of the API will allow the user to modify fields of a specific version of the file's metadata. + +The Dataset version id can be either the ID of the Dataset version (i.e. 12345) or the Friendly version (i.e. 1.0). + +As noted above the dataFileTags are not versioned and any change to them for this version will also change them in the draft version. It is not recommended to change them with this API. + +.. code-block:: bash + + export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + export SERVER_URL=https://demo.dataverse.org + export ID=24 + export DATASET_VERSION_ID=1.0 + + curl -H "X-Dataverse-key:$API_TOKEN" -X POST \ + -F 'jsonData={"description":"My description bbb.","provFreeform":"Test prov freeform","categories":["Data"]}' \ + "$SERVER_URL/api/files/$ID/metadata/version/$DATASET_VERSION_ID" + +The fully expanded example above (without environment variables) looks like this: + +.. code-block:: bash + + curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -X POST \ + -F 'jsonData={"description":"My description bbb.","provFreeform":"Test prov freeform","categories":["Data"]}' \ + "https://demo.dataverse.org/api/files/:persistentId/metadata/version/1.0?persistentId=doi:10.5072/FK2/AAA000" + .. _EditingVariableMetadata: Updating File Metadata Categories diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Files.java b/src/main/java/edu/harvard/iq/dataverse/api/Files.java index 61a69236f57..e7459c1b325 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Files.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Files.java @@ -45,6 +45,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.concurrent.atomic.AtomicReference; import java.util.logging.Level; import java.util.logging.Logger; @@ -531,7 +532,73 @@ public Response updateFileMetadata(@Context ContainerRequestContext crc, @FormDa .type(MediaType.TEXT_PLAIN) //Our plain text string is already json .build(); } + @POST + @AuthRequired + @Path("{id}/metadata/version/{datasetVersionId}") + public Response updateFileMetadata(@Context ContainerRequestContext crc, @FormDataParam("jsonData") String jsonData, + @PathParam("id") String fileIdOrPersistentId, + @PathParam("datasetVersionId") String datasetVersionId) { + DataverseRequest req; + try { + req = createDataverseRequest(getRequestUser(crc)); + } catch (Exception e) { + return error(BAD_REQUEST, "Error attempting to request information. Maybe a bad API token?"); + } + final DataFile df; + FileMetadata fm = null; + try { + df = execCommand(new GetDataFileCommand(req, findDataFileOrDie(fileIdOrPersistentId))); + fm = df.getFileMetadata(); + for (FileMetadata md : df.getFileMetadatas()) { + if (datasetVersionId.equals(String.valueOf(md.getDatasetVersion().getId())) || + datasetVersionId.equals(md.getDatasetVersion().getFriendlyVersionNumber())) { + fm = md; + } + } + } catch (Exception e) { + return error(BAD_REQUEST, "Error attempting get the requested data file."); + } + + try { + OptionalFileParams optionalFileParams = null; + if (jsonData != null) { + // Load optional params via JSON + optionalFileParams = new OptionalFileParams(jsonData); + } else { + return error(BAD_REQUEST, "Missing Form Data!"); + } + List fmdListMinusCurrentFile = new ArrayList<>(); + for (FileMetadata fileMetadata : df.getFileMetadatas()) { + if (!fileMetadata.getDataFile().equals(df)) { + fmdListMinusCurrentFile.add(fileMetadata); + } + } + jakarta.json.JsonObject jsonObject = JsonUtil.getJsonObject(jsonData); + String incomingLabel = jsonObject.getString("label", null); + String incomingDirectoryLabel = jsonObject.getString("directoryLabel", null); + String existingLabel = fm.getLabel(); + String existingDirectoryLabel = fm.getDirectoryLabel(); + String pathPlusFilename = IngestUtil.getPathAndFileNameToCheck(incomingLabel, incomingDirectoryLabel, existingLabel, existingDirectoryLabel); + if (IngestUtil.conflictsWithExistingFilenames(pathPlusFilename, fmdListMinusCurrentFile)) { + return error(BAD_REQUEST, BundleUtil.getStringFromBundle("files.api.metadata.update.duplicateFile", Arrays.asList(pathPlusFilename))); + } + + optionalFileParams.addOptionalParams(fm); + execCommand(new UpdateDatasetVersionCommand(fm.getDataFile().getOwner(), req, fm)); + + } catch (DataFileTagException ex) { + return error(BAD_REQUEST, ex.getMessage()); + } catch (Exception e) { + return error(Response.Status.INTERNAL_SERVER_ERROR, "Error updating metadata to DataFile: " + e); + } + String jsonString = fm.asGsonObject(true).toString(); + return Response + .status(Response.Status.OK) + .entity("File Metadata update has been completed: " + jsonString) + .type(MediaType.TEXT_PLAIN) //Our plain text string is already json + .build(); + } @GET @AuthRequired @Path("{id}") diff --git a/src/main/java/edu/harvard/iq/dataverse/datasetutility/OptionalFileParams.java b/src/main/java/edu/harvard/iq/dataverse/datasetutility/OptionalFileParams.java index 54844160163..f7df81b6386 100644 --- a/src/main/java/edu/harvard/iq/dataverse/datasetutility/OptionalFileParams.java +++ b/src/main/java/edu/harvard/iq/dataverse/datasetutility/OptionalFileParams.java @@ -194,46 +194,28 @@ public boolean getTabIngest() { return this.tabIngest; } - public boolean hasCategories(){ - if ((categories == null)||(this.categories.isEmpty())){ - return false; - } - return true; + public boolean hasCategories() { + return categories != null; } - public boolean hasFileDataTags(){ - if ((dataFileTags == null)||(this.dataFileTags.isEmpty())){ - return false; - } - return true; + public boolean hasFileDataTags() { + return dataFileTags != null; } public boolean hasDescription(){ - if ((description == null)||(this.description.isEmpty())){ - return false; - } - return true; + return description != null; } - public boolean hasDirectoryLabel(){ - if ((directoryLabel == null)||(this.directoryLabel.isEmpty())){ - return false; - } - return true; + public boolean hasDirectoryLabel() { + return directoryLabel != null; } - public boolean hasLabel(){ - if ((label == null)||(this.label.isEmpty())){ - return false; - } - return true; + public boolean hasLabel() { + return label != null; } - public boolean hasProvFreeform(){ - if ((provFreeForm == null)||(this.provFreeForm.isEmpty())){ - return false; - } - return true; + public boolean hasProvFreeform() { + return provFreeForm != null; } public boolean hasStorageIdentifier() { @@ -245,7 +227,7 @@ public String getStorageIdentifier() { } public boolean hasFileName() { - return ((fileName!=null)&&(!fileName.isEmpty())); + return fileName != null; } public String getFileName() { @@ -253,7 +235,7 @@ public String getFileName() { } public boolean hasMimetype() { - return ((mimeType!=null)&&(!mimeType.isEmpty())); + return mimeType != null; } public String getMimeType() { @@ -266,7 +248,7 @@ public void setCheckSum(String checkSum, ChecksumType type) { } public boolean hasCheckSum() { - return ((checkSumValue!=null)&&(!checkSumValue.isEmpty())); + return checkSumValue != null; } public String getCheckSum() { @@ -294,15 +276,10 @@ public void setFileSize(long fileSize) { * @param tags */ public void setCategories(List newCategories) { - if (newCategories != null) { newCategories = Util.removeDuplicatesNullsEmptyStrings(newCategories); - if (newCategories.isEmpty()) { - newCategories = null; - } + this.categories = newCategories; } - - this.categories = newCategories; } /** @@ -495,27 +472,20 @@ private void addFileDataTags(List potentialTags) throws DataFileTagExcep } potentialTags = Util.removeDuplicatesNullsEmptyStrings(potentialTags); - - if (potentialTags.isEmpty()){ - return; - } - + // Make a new list - this.dataFileTags = new ArrayList<>(); + List newList = new ArrayList<>(); // Add valid potential tags to the list for (String tagToCheck : potentialTags){ if (DataFileTag.isDataFileTag(tagToCheck)){ - this.dataFileTags.add(tagToCheck); + newList.add(tagToCheck); }else{ String errMsg = BundleUtil.getStringFromBundle("file.addreplace.error.invalid_datafile_tag"); throw new DataFileTagException(errMsg + " [" + tagToCheck + "]. Please use one of the following: " + DataFileTag.getListofLabelsAsString()); } } - // Shouldn't happen.... - if (dataFileTags.isEmpty()){ - dataFileTags = null; - } + this.dataFileTags = newList; } private void msg(String s){ diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java index d7cce94a0b8..de940c30e17 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java @@ -1,6 +1,7 @@ package edu.harvard.iq.dataverse.api; import edu.harvard.iq.dataverse.authorization.DataverseRole; +import edu.harvard.iq.dataverse.datasetutility.OptionalFileParams; import io.restassured.RestAssured; import io.restassured.response.Response; @@ -3189,4 +3190,126 @@ public void testFileCitationByVersion() throws IOException { } + // This test handles both updating with empty fields to clear the field and + // update a specific file metadata for dataset version + // Both APIs will be tested /api/files/{id}/metadata and /api/files/{id}/metadata/version/{datasetVersionId} + @Test + public void testUpdateSpecificMetadataVersionAndTestUpdateWithEmptyFields() { + // Create User, Dataverse, and Dataset + Response createUser = UtilIT.createRandomUser(); + createUser.then().assertThat().statusCode(OK.getStatusCode()); + String apiToken = UtilIT.getApiTokenFromResponse(createUser); + + Response createDataverseResponse = UtilIT.createRandomDataverse(apiToken); + createDataverseResponse.then().assertThat().statusCode(CREATED.getStatusCode()); + String dataverseAlias = UtilIT.getAliasFromResponse(createDataverseResponse); + + Response createDatasetResponse = UtilIT.createRandomDatasetViaNativeApi(dataverseAlias, apiToken); + createDatasetResponse.prettyPrint(); + createDatasetResponse.then().assertThat().statusCode(CREATED.getStatusCode()); + Integer datasetId = JsonPath.from(createDatasetResponse.body().asString()).getInt("data.id"); + + // Upload a tab file + JsonObjectBuilder json = Json.createObjectBuilder() + .add(OptionalFileParams.DESCRIPTION_ATTR_NAME, "my description") + .add(OptionalFileParams.DIRECTORY_LABEL_ATTR_NAME, "data/subdir1") + .add(OptionalFileParams.PROVENANCE_FREEFORM_ATTR_NAME, "prov Free Form") + .add(OptionalFileParams.CATEGORIES_ATTR_NAME, Json.createArrayBuilder().add("Data")); + String pathToTestFile = "src/test/resources/tab/test.tab"; + Response uploadFile = UtilIT.uploadFileViaNative(datasetId.toString(), pathToTestFile, json.build(), apiToken); + uploadFile.prettyPrint(); + uploadFile.then().assertThat().statusCode(OK.getStatusCode()); + Long fileId = JsonPath.from(uploadFile.body().asString()).getLong("data.files[0].dataFile.id"); + assertTrue(UtilIT.sleepForLock(datasetId, "Ingest", apiToken, UtilIT.MAXIMUM_INGEST_LOCK_DURATION), "Failed test if Ingest Lock exceeds max duration " + pathToTestFile); + + // Can't add tags until after the file is ingested and determined to be a tabular file + JsonObjectBuilder updateFileJson = Json.createObjectBuilder() + .add(OptionalFileParams.FILE_DATA_TAGS_ATTR_NAME, Json.createArrayBuilder().add("Survey")); + Response updateFileResponse = UtilIT.updateFileMetadata(String.valueOf(fileId), updateFileJson.build().toString(), apiToken); + updateFileResponse.prettyPrint(); + + // Get and verify the FileData + Response getFile = UtilIT.getFileData(String.valueOf(fileId), apiToken); + getFile.prettyPrint(); + getFile.then().assertThat() + .statusCode(OK.getStatusCode()) + .body("data.description", equalTo("my description")) + .body("data.dataFile.description", equalTo("my description")) + .body("data.directoryLabel", equalTo("data/subdir1")) + .body("data.categories", hasItem("Data")) + .body("data.dataFile.tabularTags", hasItem("Survey")); + + // Publish the Dataverse and Dataset + Response publishResponse = UtilIT.publishDataverseViaNativeApi(dataverseAlias, apiToken); + publishResponse.then().assertThat().statusCode(OK.getStatusCode()); + publishResponse = UtilIT.publishDatasetViaNativeApi(datasetId, "major", apiToken); + publishResponse.then().assertThat().statusCode(OK.getStatusCode()); + + // Create a new DRAFT version + json = Json.createObjectBuilder() + .add(OptionalFileParams.DESCRIPTION_ATTR_NAME, "my 1.1 description"); + Response updateResponse = UtilIT.updateFileMetadata(String.valueOf(fileId), json.build().toString(), apiToken); + updateResponse.then().assertThat().statusCode(OK.getStatusCode()); + + // Publish the draft version as 1.1 + publishResponse = UtilIT.publishDatasetViaNativeApi(datasetId, "minor", apiToken); + publishResponse.then().assertThat().statusCode(OK.getStatusCode()); + publishResponse.prettyPrint(); + + // We now have a 1.0 version and 1.1 version. Now we modify the 1.0 version + String version = "1.0"; + json = Json.createObjectBuilder() + .add(OptionalFileParams.DESCRIPTION_ATTR_NAME, "") + .add(OptionalFileParams.LABEL_ATTR_NAME, "test.tab") + .add(OptionalFileParams.DIRECTORY_LABEL_ATTR_NAME, "") + .add(OptionalFileParams.PROVENANCE_FREEFORM_ATTR_NAME, "") + .add(OptionalFileParams.CATEGORIES_ATTR_NAME, Json.createArrayBuilder()) + .add(OptionalFileParams.FILE_DATA_TAGS_ATTR_NAME, Json.createArrayBuilder()); + + Response updateFile = UtilIT.updateFileMetadata(String.valueOf(fileId), json.build().toString(), apiToken, version); + updateFile.prettyPrint(); + + // Get version 1.0 and see the changes + getFile = UtilIT.getFileData(String.valueOf(fileId), apiToken, version); + getFile.prettyPrint(); + getFile.then().assertThat() + .statusCode(OK.getStatusCode()) + .body("data.description", equalTo("")) + .body("data.dataFile.description", equalTo("")) + .body("data.directoryLabel", nullValue()) + .body("data.provFreeForm", nullValue()) + .body("data.categories", nullValue()) + .body("data.dataFile.tabularTags", nullValue()); + + // Get the latest version and see the original data unchanged (except description which is why the draft version was created) + getFile = UtilIT.getFileData(String.valueOf(fileId), apiToken); + getFile.prettyPrint(); + getFile.then().assertThat() + .statusCode(OK.getStatusCode()) + .body("data.description", equalTo("my 1.1 description")) + .body("data.dataFile.description", equalTo("my 1.1 description")) + .body("data.directoryLabel", equalTo("data/subdir1")) + .body("data.categories", hasItem("Data")); + + // Update metadata (creating a draft version) without the version in the path to show that this endpoint also clears the fields + json = Json.createObjectBuilder() + .add(OptionalFileParams.DESCRIPTION_ATTR_NAME, "") + .add(OptionalFileParams.LABEL_ATTR_NAME, "test.tab") + .add(OptionalFileParams.DIRECTORY_LABEL_ATTR_NAME, "") + .add(OptionalFileParams.PROVENANCE_FREEFORM_ATTR_NAME, "") + .add(OptionalFileParams.CATEGORIES_ATTR_NAME, Json.createArrayBuilder()) + .add(OptionalFileParams.FILE_DATA_TAGS_ATTR_NAME, Json.createArrayBuilder()); + updateFile = UtilIT.updateFileMetadata(String.valueOf(fileId), json.build().toString(), apiToken); + updateFile.prettyPrint(); + getFile = UtilIT.getFileData(String.valueOf(fileId), apiToken); + getFile.prettyPrint(); + getFile.then().assertThat() + .statusCode(OK.getStatusCode()) + .body("data.description", equalTo("")) + .body("data.dataFile.description", equalTo("")) + .body("data.directoryLabel", nullValue()) + .body("data.provFreeForm", nullValue()) + .body("data.categories", nullValue()) + .body("data.dataFile.tabularTags", nullValue()); + } } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index b9d403c528c..e28ece85a23 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -1088,21 +1088,28 @@ static Response deleteFileApi(Integer fileId, String apiToken) { .header(API_TOKEN_HTTP_HEADER, apiToken) .delete("/api/files/" + fileId); } - + static Response updateFileMetadata(String fileIdOrPersistentId, String jsonAsString, String apiToken) { + return updateFileMetadata(fileIdOrPersistentId, jsonAsString,apiToken, null); + } + static Response updateFileMetadata(String fileIdOrPersistentId, String jsonAsString, String apiToken, String datasetVersionId) { String idInPath = fileIdOrPersistentId; // Assume it's a number. + String versionInPath = ""; String optionalQueryParam = ""; // If idOrPersistentId is a number we'll just put it in the path. if (!NumberUtils.isCreatable(fileIdOrPersistentId)) { idInPath = ":persistentId"; optionalQueryParam = "?persistentId=" + fileIdOrPersistentId; } + if (datasetVersionId != null) { + versionInPath = "/version/" + datasetVersionId; + } RequestSpecification requestSpecification = given() .header(API_TOKEN_HTTP_HEADER, apiToken); if (jsonAsString != null) { requestSpecification.multiPart("jsonData", jsonAsString); } return requestSpecification - .post("/api/files/" + idInPath + "/metadata" + optionalQueryParam); + .post("/api/files/" + idInPath + "/metadata" + versionInPath + optionalQueryParam); } static Response downloadFile(Integer fileId) { diff --git a/src/test/java/edu/harvard/iq/dataverse/datasetutility/OptionalFileParamsTest.java b/src/test/java/edu/harvard/iq/dataverse/datasetutility/OptionalFileParamsTest.java index c9f251f7e77..cbca33f409d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/datasetutility/OptionalFileParamsTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/datasetutility/OptionalFileParamsTest.java @@ -195,8 +195,9 @@ public void test_09_unusedParamsGood() throws DataFileTagException { assertNull(instance.getDescription()); assertFalse(instance.hasDescription()); - assertNull(instance.getCategories()); - assertFalse(instance.hasCategories()); + assertNotNull(instance.getCategories()); + assertTrue(instance.hasCategories()); + assertTrue(instance.getCategories().isEmpty()); assertNull(instance.getDataFileTags()); assertFalse(instance.hasFileDataTags()); @@ -292,4 +293,4 @@ private void msgt(String s){ print json.dumps(json.dumps(d)) -*/ \ No newline at end of file +*/ From 6d871aabb8c0d5514bdba794384c0ce26df989b4 Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Fri, 18 Apr 2025 17:05:23 -0400 Subject: [PATCH 004/470] new version checking --- .../11392-edit-file-metadata-empty-values.md | 6 +- doc/sphinx-guides/source/api/native-api.rst | 36 +-------- .../edu/harvard/iq/dataverse/api/Files.java | 75 ++----------------- src/main/java/propertyFiles/Bundle.properties | 1 + .../edu/harvard/iq/dataverse/api/FilesIT.java | 69 +++++------------ .../edu/harvard/iq/dataverse/api/UtilIT.java | 4 +- 6 files changed, 33 insertions(+), 158 deletions(-) diff --git a/doc/release-notes/11392-edit-file-metadata-empty-values.md b/doc/release-notes/11392-edit-file-metadata-empty-values.md index 66059444e4f..e42bef13aec 100644 --- a/doc/release-notes/11392-edit-file-metadata-empty-values.md +++ b/doc/release-notes/11392-edit-file-metadata-empty-values.md @@ -2,10 +2,6 @@ Previously the API POST /files/{id}/metadata would ignore fields with empty values. Now the API updates the fields with the empty values essentially clearing the data. Missing fields will still be ignored. -This feature also adds a new version of the POST endpoint (/files/{id}/metadata/version/{datasetVersion}) to specify the dataset version to make the file metadata change to. - -datasetVersion can either be the actual ID (12345) or the friendly version (1.0) - -Note that certain fields (i.e. dataFileTags) are not versioned and changes to these will update the published as well as draft versions of the file. +An optional query parameter was added to ensure the metadata update doesn't overwrite stale data. See also [the guides](https://dataverse-guide--11359.org.readthedocs.build/en/11359/api/native-api.html#updating-file-metadata), #11392, and #11359. diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index aba31670aa1..9bf7b3679bf 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -4612,9 +4612,7 @@ Updating File Metadata Updates the file metadata for an existing file where ``ID`` is the database id of the file to update or ``PERSISTENT_ID`` is the persistent id (DOI or Handle) of the file. Requires a ``jsonString`` expressing the new metadata. No metadata from the previous version of this file will be persisted, so if you want to update a specific field first get the json with the above command and alter the fields you want. -An extended version of this API will allow for the Dataset Version ID to be specified in order to modify fields of a Datafile in an already published version of the Dataset. - -Note: As of Dataverse 6.7 passing in an empty value for a string field ("description":"") or an empty array for a list ("categories":[]) will clear the data for that field. In prior versions these fields would be ignored. To ignore the fields simply leave them out of the ``jsonString``. +Optional Parameter for verifying that the Dataset Version being edited is the latest version can be added &datasetVersionId=12345. This is to prevent stale data from being edited. A curl example using an ``ID`` @@ -4643,10 +4641,11 @@ A curl example using a ``PERSISTENT_ID`` export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx export SERVER_URL=https://demo.dataverse.org export PERSISTENT_ID=doi:10.5072/FK2/AAA000 + export VERSION_ID=12345 curl -H "X-Dataverse-key:$API_TOKEN" -X POST \ -F 'jsonData={"description":"My description bbb.","provFreeform":"Test prov freeform","categories":["Data"],"dataFileTags":["Survey"],"restrict":false}' \ - "$SERVER_URL/api/files/:persistentId/metadata?persistentId=$PERSISTENT_ID" + "$SERVER_URL/api/files/:persistentId/metadata?persistentId=$PERSISTENT_ID&datasetVersionId=$VERSION_ID" The fully expanded example above (without environment variables) looks like this: @@ -4654,39 +4653,12 @@ The fully expanded example above (without environment variables) looks like this curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -X POST \ -F 'jsonData={"description":"My description bbb.","provFreeform":"Test prov freeform","categories":["Data"],"dataFileTags":["Survey"],"restrict":false}' \ - "https://demo.dataverse.org/api/files/:persistentId/metadata?persistentId=doi:10.5072/FK2/AAA000" + "https://demo.dataverse.org/api/files/:persistentId/metadata?persistentId=doi:10.5072/FK2/AAA000&datasetVersionId=12345" Note: To update the 'tabularTags' property of file metadata, use the 'dataFileTags' key when making API requests. This property is used to update the 'tabularTags' of the file metadata. Also note that dataFileTags are not versioned and changes to these will update the published version of the file. -Extended version of the API: - -This extended version of the API will allow the user to modify fields of a specific version of the file's metadata. - -The Dataset version id can be either the ID of the Dataset version (i.e. 12345) or the Friendly version (i.e. 1.0). - -As noted above the dataFileTags are not versioned and any change to them for this version will also change them in the draft version. It is not recommended to change them with this API. - -.. code-block:: bash - - export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - export SERVER_URL=https://demo.dataverse.org - export ID=24 - export DATASET_VERSION_ID=1.0 - - curl -H "X-Dataverse-key:$API_TOKEN" -X POST \ - -F 'jsonData={"description":"My description bbb.","provFreeform":"Test prov freeform","categories":["Data"]}' \ - "$SERVER_URL/api/files/$ID/metadata/version/$DATASET_VERSION_ID" - -The fully expanded example above (without environment variables) looks like this: - -.. code-block:: bash - - curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -X POST \ - -F 'jsonData={"description":"My description bbb.","provFreeform":"Test prov freeform","categories":["Data"]}' \ - "https://demo.dataverse.org/api/files/:persistentId/metadata/version/1.0?persistentId=doi:10.5072/FK2/AAA000" - .. _EditingVariableMetadata: Updating File Metadata Categories diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Files.java b/src/main/java/edu/harvard/iq/dataverse/api/Files.java index e7459c1b325..cd106d728b1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Files.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Files.java @@ -45,7 +45,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.concurrent.atomic.AtomicReference; import java.util.logging.Level; import java.util.logging.Logger; @@ -411,8 +410,8 @@ public Response deleteFileInDataset(@Context ContainerRequestContext crc, @PathP @AuthRequired @Path("{id}/metadata") public Response updateFileMetadata(@Context ContainerRequestContext crc, @FormDataParam("jsonData") String jsonData, - @PathParam("id") String fileIdOrPersistentId - ) throws DataFileTagException, CommandException { + @PathParam("id") String fileIdOrPersistentId, @QueryParam("datasetVersionId") String datasetVersionId + ) throws CommandException { FileMetadata upFmd = null; @@ -430,6 +429,10 @@ public Response updateFileMetadata(@Context ContainerRequestContext crc, @FormDa return error(BAD_REQUEST, "Error attempting get the requested data file."); } + Long latestDatasetVersion = df.getFileMetadata().getDatasetVersion().getId(); + if (datasetVersionId != null && latestDatasetVersion != Long.valueOf(datasetVersionId)) { + return error(Response.Status.BAD_REQUEST, BundleUtil.getStringFromBundle("file.metadata.message.parallelUpdateError")); + } //You shouldn't be trying to edit a datafile that has been replaced List result = em.createNamedQuery("DataFile.findDataFileThatReplacedId", Long.class) @@ -532,73 +535,7 @@ public Response updateFileMetadata(@Context ContainerRequestContext crc, @FormDa .type(MediaType.TEXT_PLAIN) //Our plain text string is already json .build(); } - @POST - @AuthRequired - @Path("{id}/metadata/version/{datasetVersionId}") - public Response updateFileMetadata(@Context ContainerRequestContext crc, @FormDataParam("jsonData") String jsonData, - @PathParam("id") String fileIdOrPersistentId, - @PathParam("datasetVersionId") String datasetVersionId) { - DataverseRequest req; - try { - req = createDataverseRequest(getRequestUser(crc)); - } catch (Exception e) { - return error(BAD_REQUEST, "Error attempting to request information. Maybe a bad API token?"); - } - final DataFile df; - FileMetadata fm = null; - try { - df = execCommand(new GetDataFileCommand(req, findDataFileOrDie(fileIdOrPersistentId))); - fm = df.getFileMetadata(); - for (FileMetadata md : df.getFileMetadatas()) { - if (datasetVersionId.equals(String.valueOf(md.getDatasetVersion().getId())) || - datasetVersionId.equals(md.getDatasetVersion().getFriendlyVersionNumber())) { - fm = md; - } - } - } catch (Exception e) { - return error(BAD_REQUEST, "Error attempting get the requested data file."); - } - try { - OptionalFileParams optionalFileParams = null; - if (jsonData != null) { - // Load optional params via JSON - optionalFileParams = new OptionalFileParams(jsonData); - } else { - return error(BAD_REQUEST, "Missing Form Data!"); - } - List fmdListMinusCurrentFile = new ArrayList<>(); - for (FileMetadata fileMetadata : df.getFileMetadatas()) { - if (!fileMetadata.getDataFile().equals(df)) { - fmdListMinusCurrentFile.add(fileMetadata); - } - } - jakarta.json.JsonObject jsonObject = JsonUtil.getJsonObject(jsonData); - String incomingLabel = jsonObject.getString("label", null); - String incomingDirectoryLabel = jsonObject.getString("directoryLabel", null); - String existingLabel = fm.getLabel(); - String existingDirectoryLabel = fm.getDirectoryLabel(); - String pathPlusFilename = IngestUtil.getPathAndFileNameToCheck(incomingLabel, incomingDirectoryLabel, existingLabel, existingDirectoryLabel); - if (IngestUtil.conflictsWithExistingFilenames(pathPlusFilename, fmdListMinusCurrentFile)) { - return error(BAD_REQUEST, BundleUtil.getStringFromBundle("files.api.metadata.update.duplicateFile", Arrays.asList(pathPlusFilename))); - } - - optionalFileParams.addOptionalParams(fm); - execCommand(new UpdateDatasetVersionCommand(fm.getDataFile().getOwner(), req, fm)); - - } catch (DataFileTagException ex) { - return error(BAD_REQUEST, ex.getMessage()); - } catch (Exception e) { - return error(Response.Status.INTERNAL_SERVER_ERROR, "Error updating metadata to DataFile: " + e); - } - - String jsonString = fm.asGsonObject(true).toString(); - return Response - .status(Response.Status.OK) - .entity("File Metadata update has been completed: " + jsonString) - .type(MediaType.TEXT_PLAIN) //Our plain text string is already json - .build(); - } @GET @AuthRequired @Path("{id}") diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index d7fd94bf65c..18e2406c2a9 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -1945,6 +1945,7 @@ file.metaData.dataFile.dataTab.unf=UNF file.metaData.dataFile.dataTab.variables=Variables file.metaData.dataFile.dataTab.observations=Observations file.metaData.fileAccess=File Access: +file.metadata.message.parallelUpdateError=Changes cannot be saved. This metadata has been edited since this page was opened. To continue, copy your changes, refresh the page to see the recent updates, and re-enter any changes you want to save. file.addDescription=Add file description... file.tags=Tags file.editTags=Edit Tags diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java index de940c30e17..91246552886 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java @@ -3190,11 +3190,8 @@ public void testFileCitationByVersion() throws IOException { } - // This test handles both updating with empty fields to clear the field and - // update a specific file metadata for dataset version - // Both APIs will be tested /api/files/{id}/metadata and /api/files/{id}/metadata/version/{datasetVersionId} @Test - public void testUpdateSpecificMetadataVersionAndTestUpdateWithEmptyFields() { + public void testUpdateWithEmptyFieldsAndVersionCheck() { // Create User, Dataverse, and Dataset Response createUser = UtilIT.createRandomUser(); createUser.then().assertThat().statusCode(OK.getStatusCode()); @@ -3245,53 +3242,12 @@ public void testUpdateSpecificMetadataVersionAndTestUpdateWithEmptyFields() { publishResponse = UtilIT.publishDatasetViaNativeApi(datasetId, "major", apiToken); publishResponse.then().assertThat().statusCode(OK.getStatusCode()); - // Create a new DRAFT version - json = Json.createObjectBuilder() - .add(OptionalFileParams.DESCRIPTION_ATTR_NAME, "my 1.1 description"); - Response updateResponse = UtilIT.updateFileMetadata(String.valueOf(fileId), json.build().toString(), apiToken); - updateResponse.then().assertThat().statusCode(OK.getStatusCode()); - - // Publish the draft version as 1.1 - publishResponse = UtilIT.publishDatasetViaNativeApi(datasetId, "minor", apiToken); - publishResponse.then().assertThat().statusCode(OK.getStatusCode()); - publishResponse.prettyPrint(); - - // We now have a 1.0 version and 1.1 version. Now we modify the 1.0 version - String version = "1.0"; - json = Json.createObjectBuilder() - .add(OptionalFileParams.DESCRIPTION_ATTR_NAME, "") - .add(OptionalFileParams.LABEL_ATTR_NAME, "test.tab") - .add(OptionalFileParams.DIRECTORY_LABEL_ATTR_NAME, "") - .add(OptionalFileParams.PROVENANCE_FREEFORM_ATTR_NAME, "") - .add(OptionalFileParams.CATEGORIES_ATTR_NAME, Json.createArrayBuilder()) - .add(OptionalFileParams.FILE_DATA_TAGS_ATTR_NAME, Json.createArrayBuilder()); - - Response updateFile = UtilIT.updateFileMetadata(String.valueOf(fileId), json.build().toString(), apiToken, version); - updateFile.prettyPrint(); - - // Get version 1.0 and see the changes - getFile = UtilIT.getFileData(String.valueOf(fileId), apiToken, version); - getFile.prettyPrint(); - getFile.then().assertThat() - .statusCode(OK.getStatusCode()) - .body("data.description", equalTo("")) - .body("data.dataFile.description", equalTo("")) - .body("data.directoryLabel", nullValue()) - .body("data.provFreeForm", nullValue()) - .body("data.categories", nullValue()) - .body("data.dataFile.tabularTags", nullValue()); - - // Get the latest version and see the original data unchanged (except description which is why the draft version was created) + // Get the base version getFile = UtilIT.getFileData(String.valueOf(fileId), apiToken); getFile.prettyPrint(); - getFile.then().assertThat() - .statusCode(OK.getStatusCode()) - .body("data.description", equalTo("my 1.1 description")) - .body("data.dataFile.description", equalTo("my 1.1 description")) - .body("data.directoryLabel", equalTo("data/subdir1")) - .body("data.categories", hasItem("Data")); + String datasetVersionId = String.valueOf(JsonPath.from(getFile.body().asString()).getInt("data.datasetVersionId")); - // Update metadata (creating a draft version) without the version in the path to show that this endpoint also clears the fields + // first user updates which creates a new DRAFT version json = Json.createObjectBuilder() .add(OptionalFileParams.DESCRIPTION_ATTR_NAME, "") .add(OptionalFileParams.LABEL_ATTR_NAME, "test.tab") @@ -3299,8 +3255,11 @@ public void testUpdateSpecificMetadataVersionAndTestUpdateWithEmptyFields() { .add(OptionalFileParams.PROVENANCE_FREEFORM_ATTR_NAME, "") .add(OptionalFileParams.CATEGORIES_ATTR_NAME, Json.createArrayBuilder()) .add(OptionalFileParams.FILE_DATA_TAGS_ATTR_NAME, Json.createArrayBuilder()); - updateFile = UtilIT.updateFileMetadata(String.valueOf(fileId), json.build().toString(), apiToken); - updateFile.prettyPrint(); + Response updateResponse = UtilIT.updateFileMetadata(String.valueOf(fileId), json.build().toString(), apiToken, datasetVersionId); + updateResponse.prettyPrint(); + updateResponse.then().assertThat().statusCode(OK.getStatusCode()); + + // Get the latest version getFile = UtilIT.getFileData(String.valueOf(fileId), apiToken); getFile.prettyPrint(); getFile.then().assertThat() @@ -3311,5 +3270,15 @@ public void testUpdateSpecificMetadataVersionAndTestUpdateWithEmptyFields() { .body("data.provFreeForm", nullValue()) .body("data.categories", nullValue()) .body("data.dataFile.tabularTags", nullValue()); + + // Second user updates the base version which should fail since it's already been updated + json = Json.createObjectBuilder() + .add(OptionalFileParams.DESCRIPTION_ATTR_NAME, "my new description"); + updateResponse = UtilIT.updateFileMetadata(String.valueOf(fileId), json.build().toString(), apiToken, datasetVersionId); + updateResponse.prettyPrint(); + updateResponse.then().assertThat() + .body("status", equalTo(ApiConstants.STATUS_ERROR)) + .body("message", equalTo(BundleUtil.getStringFromBundle("file.metadata.message.parallelUpdateError"))) + .statusCode(BAD_REQUEST.getStatusCode()); } } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index e28ece85a23..935cc91a82e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -1101,7 +1101,7 @@ static Response updateFileMetadata(String fileIdOrPersistentId, String jsonAsStr optionalQueryParam = "?persistentId=" + fileIdOrPersistentId; } if (datasetVersionId != null) { - versionInPath = "/version/" + datasetVersionId; + optionalQueryParam = (optionalQueryParam.isEmpty() ? "?" : "&") + "datasetVersionId=" + datasetVersionId; } RequestSpecification requestSpecification = given() .header(API_TOKEN_HTTP_HEADER, apiToken); @@ -1109,7 +1109,7 @@ static Response updateFileMetadata(String fileIdOrPersistentId, String jsonAsStr requestSpecification.multiPart("jsonData", jsonAsString); } return requestSpecification - .post("/api/files/" + idInPath + "/metadata" + versionInPath + optionalQueryParam); + .post("/api/files/" + idInPath + "/metadata" + optionalQueryParam); } static Response downloadFile(Integer fileId) { From fd800fc95d8d57a0192d8bd6ac49d62531dcaa92 Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Fri, 18 Apr 2025 17:08:55 -0400 Subject: [PATCH 005/470] fix test --- src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index 935cc91a82e..9a09a5edd9f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -1094,14 +1094,13 @@ static Response updateFileMetadata(String fileIdOrPersistentId, String jsonAsStr } static Response updateFileMetadata(String fileIdOrPersistentId, String jsonAsString, String apiToken, String datasetVersionId) { String idInPath = fileIdOrPersistentId; // Assume it's a number. - String versionInPath = ""; String optionalQueryParam = ""; // If idOrPersistentId is a number we'll just put it in the path. if (!NumberUtils.isCreatable(fileIdOrPersistentId)) { idInPath = ":persistentId"; optionalQueryParam = "?persistentId=" + fileIdOrPersistentId; } if (datasetVersionId != null) { - optionalQueryParam = (optionalQueryParam.isEmpty() ? "?" : "&") + "datasetVersionId=" + datasetVersionId; + optionalQueryParam = optionalQueryParam + (optionalQueryParam.isEmpty() ? "?" : "&") + "datasetVersionId=" + datasetVersionId; } RequestSpecification requestSpecification = given() .header(API_TOKEN_HTTP_HEADER, apiToken); From 8d5e3bcb2b41ac9760f8bcd7b0812c4ddf8d1aa1 Mon Sep 17 00:00:00 2001 From: jo-pol Date: Tue, 22 Apr 2025 15:20:45 +0200 Subject: [PATCH 006/470] unit tests --- .../iq/dataverse/DatasetFieldServiceBean.java | 9 +- .../DatasetFieldServiceBeanDansTest.java | 103 ++ .../DatasetFieldServiceBeanTest.java | 1 + .../cvoc-dans-config/AATClassification.json | 92 + .../json/cvoc-dans-config/abrArtifact.json | 53 + .../json/cvoc-dans-config/abrComplex.json | 53 + .../json/cvoc-dans-config/abrPeriod.json | 53 + .../json/cvoc-dans-config/abrRapportType.json | 53 + .../cvoc-dans-config/abrVerwervingswijze.json | 53 + .../json/cvoc-dans-config/audience.json | 53 + .../json/cvoc-dans-config/collection.json | 53 + .../json/cvoc-dans-value/abrArtifact.json | 167 ++ .../json/cvoc-dans-value/abrComplex.json | 64 + .../json/cvoc-dans-value/abrPeriod.json | 1535 +++++++++++++++++ .../json/cvoc-dans-value/abrRapportType.json | 53 + .../cvoc-dans-value/abrVerwervingswijze.json | 65 + .../json/cvoc-dans-value/audience.json | 88 + 17 files changed, 2544 insertions(+), 4 deletions(-) create mode 100644 src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java create mode 100644 src/test/resources/json/cvoc-dans-config/AATClassification.json create mode 100644 src/test/resources/json/cvoc-dans-config/abrArtifact.json create mode 100644 src/test/resources/json/cvoc-dans-config/abrComplex.json create mode 100644 src/test/resources/json/cvoc-dans-config/abrPeriod.json create mode 100644 src/test/resources/json/cvoc-dans-config/abrRapportType.json create mode 100644 src/test/resources/json/cvoc-dans-config/abrVerwervingswijze.json create mode 100644 src/test/resources/json/cvoc-dans-config/audience.json create mode 100644 src/test/resources/json/cvoc-dans-config/collection.json create mode 100644 src/test/resources/json/cvoc-dans-value/abrArtifact.json create mode 100644 src/test/resources/json/cvoc-dans-value/abrComplex.json create mode 100644 src/test/resources/json/cvoc-dans-value/abrPeriod.json create mode 100644 src/test/resources/json/cvoc-dans-value/abrRapportType.json create mode 100644 src/test/resources/json/cvoc-dans-value/abrVerwervingswijze.json create mode 100644 src/test/resources/json/cvoc-dans-value/audience.json diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java index 88e430ae046..3daf82dead7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java @@ -20,7 +20,6 @@ import java.util.Set; import java.util.logging.Logger; -import com.google.gson.GsonBuilder; import jakarta.ejb.EJB; import jakarta.ejb.Stateless; import jakarta.inject.Named; @@ -650,7 +649,7 @@ private JsonObject filterResponse(JsonObject cvocEntry, JsonObject readObject, S logger.fine("RF: " + filtering.toString()); JsonObject managedFields = cvocEntry.getJsonObject("managed-fields"); logger.fine("MF: " + managedFields.toString()); - int nrOfNoutFound = 0; + int nrOfNotFound = 0; for (String filterKey : filtering.keySet()) { if (!filterKey.equals("@context")) { try { @@ -671,7 +670,7 @@ private JsonObject filterResponse(JsonObject cvocEntry, JsonObject readObject, S logger.fine("PP: " + String.join(", ", pathParts)); var foundPart = processPathSegment(0, pathParts, readObject, termUri); if (foundPart == null) { - nrOfNoutFound ++ ; + nrOfNotFound ++ ; logger.warning("External Vocabulary: no value found for %s - %s".formatted(filterKey, param)); } else { vals.add(i, foundPart); @@ -717,6 +716,8 @@ else if (vals.get(0) instanceof JsonObject) { job.add(filterKey, result); logger.fine("Added : " + filterKey + ": " + result); } + } else { + logger.warning("External Vocabulary: " + termUri + " - No value found for " + filterKey); } } else { logger.fine("Added hardcoded pattern: " + filterKey + ": " + pattern); @@ -729,7 +730,7 @@ else if (vals.get(0) instanceof JsonObject) { } } } - if(nrOfNoutFound>0) { + if(nrOfNotFound>0) { logger.warning("External Vocabulary: " + termUri + " - Failed to find value(s) reported above in " +readObject); } JsonObject filteredResponse = job.build(); diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java new file mode 100644 index 00000000000..ebb290dbf04 --- /dev/null +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java @@ -0,0 +1,103 @@ +package edu.harvard.iq.dataverse; + +import edu.harvard.iq.dataverse.settings.SettingsServiceBean; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import org.jetbrains.annotations.NotNull; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.AdditionalMatchers; +import org.mockito.Mockito; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.lang.reflect.Method; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class DatasetFieldServiceBeanDansTest { + + private DatasetFieldServiceBean datasetFieldServiceBean; + + static String getCvocJson(String pathToJsonFile) throws IOException { + final File datasetVersionJson = new File(pathToJsonFile); + return new String(Files.readAllBytes(Paths.get(datasetVersionJson.getAbsolutePath()))); + } + + @BeforeEach + void setUp() { + this.datasetFieldServiceBean = Mockito.spy(new DatasetFieldServiceBean()); + } + + @AfterEach + void tearDown() { + this.datasetFieldServiceBean = null; + } + + @Test + void getIndexableStringsForAudience() throws Exception { + String termURI = "https://www.narcis.nl/classification/D13000"; + JsonObject cvocEntry = createMocks("dansAudience", termURI, "audience.json"); + JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/audience.json"); + + String result = reflectFilterResponse().invoke(datasetFieldServiceBean, cvocEntry, readObject, termURI).toString(); + + assertTrue(result.contains(termURI)); + assertTrue(result.contains("Exploitation and management of the physical environment")); + assertTrue(result.contains("Exploitatie en beheer van het fysieke milieu")); + } + + @Test + void getIndexableStringsForAbrPeriod() throws Exception { + String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/02aea074-a4a9-4335-9698-bec9a188964e"; + JsonObject cvocEntry = createMocks("dansAbrPeriod", termURI, "abrPeriod.json"); + JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/abrPeriod.json"); + + String result = reflectFilterResponse().invoke(datasetFieldServiceBean, cvocEntry, readObject, termURI).toString(); + + assertTrue(result.contains(termURI)); + assertTrue(result.contains("Vroege Middeleeuwen D")); + } + + private JsonObject readObject(String pathname) throws FileNotFoundException { + var reader = new FileReader(pathname); + return Json.createReader(reader).readObject(); + } + + private @NotNull Method reflectFilterResponse() throws NoSuchMethodException { + Method filterResponseMethod = DatasetFieldServiceBean.class.getDeclaredMethod("filterResponse", JsonObject.class, JsonObject.class, String.class); + filterResponseMethod.setAccessible(true); + return filterResponseMethod; + } + + /** + * Prepare unit tests with mock methods. + * + * @param fieldName "field-termUri" into cvoc configuration file + * @param termURI + * @param jsonFileName name of the JSON configuration/value files in: src/test/resources/json/cvoc-dans-config/ respectively src/test/resources/json/cvoc-dans-value/ + * @return {@link JsonObject} representing the configuration file + * @throws IOException in case on read error on one of the files file + */ + JsonObject createMocks(String fieldName, String termURI, String jsonFileName) throws IOException { + Long dftId = Long.parseLong("1"); + // DatasetFieldType termUri corresponding to "field-termUri" into cvoc configuration file + DatasetFieldType dft = new DatasetFieldType(fieldName, DatasetFieldType.FieldType.NONE, true); + dft.setId(dftId); + + Mockito.doReturn(dft).when(datasetFieldServiceBean).findByNameOpt(fieldName); + Mockito.doReturn(null).when(datasetFieldServiceBean).findByNameOpt(AdditionalMatchers.not(Mockito.eq(fieldName))); + + SettingsServiceBean settingsService = Mockito.mock(SettingsServiceBean.class); + fieldName = getCvocJson("src/test/resources/json/cvoc-dans-config/" + jsonFileName); + Mockito.when(settingsService.getValueForKey(SettingsServiceBean.Key.CVocConf)).thenReturn(fieldName); + datasetFieldServiceBean.settingsService = settingsService; + + return datasetFieldServiceBean.getCVocConf(false).get(dftId); + } +} diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanTest.java index 873d417131d..395b08f404e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanTest.java @@ -4,6 +4,7 @@ import java.io.File; import java.io.IOException; +import java.io.StringReader; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Collections; diff --git a/src/test/resources/json/cvoc-dans-config/AATClassification.json b/src/test/resources/json/cvoc-dans-config/AATClassification.json new file mode 100644 index 00000000000..641c467460c --- /dev/null +++ b/src/test/resources/json/cvoc-dans-config/AATClassification.json @@ -0,0 +1,92 @@ +[ + { + "field-name": "dansAATClassification", + "term-uri-field": "dansAATClassification", + "cvoc-url": "https://dev.vocabs.datastations.nl/", + "js-url": "/custom/skosmos.js", + "protocol": "skosmos", + "retrieval-uri": "https://dev.vocabs.datastations.nl/rest/v1/data?uri={0}", + "term-parent-uri": "", + "languages": "en, nl", + "allow-free-text": false, + "vocabs": { + "AATC": { + "vocabularyUri": "http://vocab.getty.edu/aat/", + "uriSpace": "http://vocab.getty.edu/aat/" + } + }, + "managed-fields": {}, + "retrieval-filtering": { + "@context": { + "termName": "https://schema.org/name", + "vocabularyName": "https://dataverse.org/schema/vocabularyName", + "vocabularyUri": "https://dataverse.org/schema/vocabularyUri", + "lang": "@language", + "value": "@value" + }, + "@id": { + "pattern": "{0}", + "params": [ + "@id" + ] + }, + "termName": { + "pattern": "{0}", + "params": [ + "/graph/uri=@id/prefLabel" + ] + }, + "vocabularyName": { + "pattern": "{0}", + "params": [ + "/graph/type=skos:ConceptScheme/label" + ] + }, + "vocabularyUri": { + "pattern": "{0}", + "params": [ + "/graph/type=skos:ConceptScheme/uri" + ] + } + } + }, + { + "field-name": "authorAffiliation", + "term-uri-field": "authorAffiliation", + "js-url": [ + "/custom/ror.js", + "/custom/cvocutils.js" + ], + "protocol": "ror", + "retrieval-uri": "https://api.ror.org/organizations/{0}", + "allow-free-text": true, + "prefix": "https://ror.org/", + "managed-fields": {}, + "languages": "", + "vocabs": { + "rors": { + "uriSpace": "https://ror.org/" + } + }, + "retrieval-filtering": { + "@context": { + "termName": "https://schema.org/name", + "scheme": "http://www.w3.org/2004/02/skos/core#inScheme", + "lang": "@language", + "content": "@value" + }, + "scheme": { + "pattern": "http://www.grid.ac/ontology/" + }, + "termName": { + "pattern": "{0}", + "params": [ + "/name" + ] + }, + "@type": { + "pattern": "https://schema.org/Organization" + } + } + } +] diff --git a/src/test/resources/json/cvoc-dans-config/abrArtifact.json b/src/test/resources/json/cvoc-dans-config/abrArtifact.json new file mode 100644 index 00000000000..a49066dd8d2 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-config/abrArtifact.json @@ -0,0 +1,53 @@ +[ + { + "field-name": "dansAbrArtifact", + "term-uri-field": "dansAbrArtifact", + "cvoc-url": "https://dev.vocabs.datastations.nl/", + "js-url": "/custom/skosmos.js", + "protocol": "skosmos", + "retrieval-uri": "https://dev.vocabs.datastations.nl/rest/v1/data?uri={0}", + "term-parent-uri": "https://data.cultureelerfgoed.nl/term/id/abr/22cbb070-6542-48f0-8afe-7d98d398cc0b", + "languages": "nl", + "allow-free-text": false, + "vocabs": { + "ABR": { + "vocabularyUri": "https://data.cultureelerfgoed.nl/term/id/abr/b6df7840-67bf-48bd-aa56-7ee39435d2ed", + "uriSpace": "https://data.cultureelerfgoed.nl/term/id/abr/" + } + }, + "managed-fields": {}, + "retrieval-filtering": { + "@context": { + "termName": "https://schema.org/name", + "vocabularyName": "https://dataverse.org/schema/vocabularyName", + "vocabularyUri": "https://dataverse.org/schema/vocabularyUri", + "lang": "@language", + "value": "@value" + }, + "@id": { + "pattern": "{0}", + "params": [ + "@id" + ] + }, + "termName": { + "pattern": "{0}", + "params": [ + "/graph/uri=@id/prefLabel" + ] + }, + "vocabularyName": { + "pattern": "{0}", + "params": [ + "/graph/type=skos:ConceptScheme/label" + ] + }, + "vocabularyUri": { + "pattern": "{0}", + "params": [ + "/graph/type=skos:ConceptScheme/uri" + ] + } + } + } +] diff --git a/src/test/resources/json/cvoc-dans-config/abrComplex.json b/src/test/resources/json/cvoc-dans-config/abrComplex.json new file mode 100644 index 00000000000..c6b826d2719 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-config/abrComplex.json @@ -0,0 +1,53 @@ +[ + { + "field-name": "dansAbrComplex", + "term-uri-field": "dansAbrComplex", + "cvoc-url": "https://dev.vocabs.datastations.nl/", + "js-url": "/custom/skosmos.js", + "protocol": "skosmos", + "retrieval-uri": "https://dev.vocabs.datastations.nl/rest/v1/data?uri={0}", + "term-parent-uri": "https://data.cultureelerfgoed.nl/term/id/abr/e9546020-4b28-4819-b0c2-29e7c864c5c0", + "languages": "nl", + "allow-free-text": false, + "vocabs": { + "ABR": { + "vocabularyUri": "https://data.cultureelerfgoed.nl/term/id/abr/b6df7840-67bf-48bd-aa56-7ee39435d2ed", + "uriSpace": "https://data.cultureelerfgoed.nl/term/id/abr/" + } + }, + "managed-fields": {}, + "retrieval-filtering": { + "@context": { + "termName": "https://schema.org/name", + "vocabularyName": "https://dataverse.org/schema/vocabularyName", + "vocabularyUri": "https://dataverse.org/schema/vocabularyUri", + "lang": "@language", + "value": "@value" + }, + "@id": { + "pattern": "{0}", + "params": [ + "@id" + ] + }, + "termName": { + "pattern": "{0}", + "params": [ + "/graph/uri=@id/prefLabel" + ] + }, + "vocabularyName": { + "pattern": "{0}", + "params": [ + "/graph/type=skos:ConceptScheme/label" + ] + }, + "vocabularyUri": { + "pattern": "{0}", + "params": [ + "/graph/type=skos:ConceptScheme/uri" + ] + } + } + } +] diff --git a/src/test/resources/json/cvoc-dans-config/abrPeriod.json b/src/test/resources/json/cvoc-dans-config/abrPeriod.json new file mode 100644 index 00000000000..086bcbe9d54 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-config/abrPeriod.json @@ -0,0 +1,53 @@ +[ + { + "field-name": "dansAbrPeriod", + "term-uri-field": "dansAbrPeriod", + "cvoc-url": "https://dev.vocabs.datastations.nl/", + "js-url": "https://github.com/gdcc/dataverse-external-vocab-support/blob/main/scripts/skosmos.js", + "protocol": "skosmos", + "retrieval-uri": "https://dev.vocabs.datastations.nl/rest/v1/data?uri={0}", + "term-parent-uri": "https://data.cultureelerfgoed.nl/term/id/abr/9b688754-1315-484b-9c89-8817e87c1e84", + "languages": "nl", + "allow-free-text": false, + "vocabs": { + "ABR": { + "vocabularyUri": "https://data.cultureelerfgoed.nl/term/id/abr/b6df7840-67bf-48bd-aa56-7ee39435d2ed", + "uriSpace": "https://data.cultureelerfgoed.nl/term/id/abr/" + } + }, + "managed-fields": {}, + "retrieval-filtering": { + "@context": { + "termName": "https://schema.org/name", + "vocabularyName": "https://dataverse.org/schema/vocabularyName", + "vocabularyUri": "https://dataverse.org/schema/vocabularyUri", + "lang": "@language", + "value": "@value" + }, + "@id": { + "pattern": "{0}", + "params": [ + "@id" + ] + }, + "termName": { + "pattern": "{0}", + "params": [ + "/graph/uri=@id/prefLabel" + ] + }, + "vocabularyName": { + "pattern": "{0}", + "params": [ + "/graph/type=skos:ConceptScheme/label" + ] + }, + "vocabularyUri": { + "pattern": "{0}", + "params": [ + "/graph/type=skos:ConceptScheme/uri" + ] + } + } + } +] diff --git a/src/test/resources/json/cvoc-dans-config/abrRapportType.json b/src/test/resources/json/cvoc-dans-config/abrRapportType.json new file mode 100644 index 00000000000..3c6c40fced1 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-config/abrRapportType.json @@ -0,0 +1,53 @@ +[ + { + "field-name": "dansAbrRapportType", + "term-uri-field": "dansAbrRapportType", + "cvoc-url": "https://dev.vocabs.datastations.nl/", + "js-url": "/custom/skosmos.js", + "protocol": "skosmos", + "retrieval-uri": "https://dev.vocabs.datastations.nl/rest/v1/data?uri={0}", + "term-parent-uri": "https://data.cultureelerfgoed.nl/term/id/abr/7a99aaba-c1e7-49a4-9dd8-d295dbcc870e", + "languages": "nl", + "allow-free-text": false, + "vocabs": { + "ABR": { + "vocabularyUri": "https://data.cultureelerfgoed.nl/term/id/abr/b6df7840-67bf-48bd-aa56-7ee39435d2ed", + "uriSpace": "https://data.cultureelerfgoed.nl/term/id/abr/" + } + }, + "managed-fields": {}, + "retrieval-filtering": { + "@context": { + "termName": "https://schema.org/name", + "vocabularyName": "https://dataverse.org/schema/vocabularyName", + "vocabularyUri": "https://dataverse.org/schema/vocabularyUri", + "lang": "@language", + "value": "@value" + }, + "@id": { + "pattern": "{0}", + "params": [ + "@id" + ] + }, + "termName": { + "pattern": "{0}", + "params": [ + "/graph/uri=@id/prefLabel" + ] + }, + "vocabularyName": { + "pattern": "{0}", + "params": [ + "/graph/type=skos:ConceptScheme/label" + ] + }, + "vocabularyUri": { + "pattern": "{0}", + "params": [ + "/graph/type=skos:ConceptScheme/uri" + ] + } + } + } +] diff --git a/src/test/resources/json/cvoc-dans-config/abrVerwervingswijze.json b/src/test/resources/json/cvoc-dans-config/abrVerwervingswijze.json new file mode 100644 index 00000000000..79b6fa179d9 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-config/abrVerwervingswijze.json @@ -0,0 +1,53 @@ +[ + { + "field-name": "dansAbrVerwervingswijze", + "term-uri-field": "dansAbrVerwervingswijze", + "cvoc-url": "https://dev.vocabs.datastations.nl/", + "js-url": "/custom/skosmos.js", + "protocol": "skosmos", + "retrieval-uri": "https://dev.vocabs.datastations.nl/rest/v1/data?uri={0}", + "term-parent-uri": "https://data.cultureelerfgoed.nl/term/id/abr/554ca1ec-3ed8-42d3-ae4b-47bcb848b238", + "languages": "nl", + "allow-free-text": false, + "vocabs": { + "ABR": { + "vocabularyUri": "https://data.cultureelerfgoed.nl/term/id/abr/b6df7840-67bf-48bd-aa56-7ee39435d2ed", + "uriSpace": "https://data.cultureelerfgoed.nl/term/id/abr/" + } + }, + "managed-fields": {}, + "retrieval-filtering": { + "@context": { + "termName": "https://schema.org/name", + "vocabularyName": "https://dataverse.org/schema/vocabularyName", + "vocabularyUri": "https://dataverse.org/schema/vocabularyUri", + "lang": "@language", + "value": "@value" + }, + "@id": { + "pattern": "{0}", + "params": [ + "@id" + ] + }, + "termName": { + "pattern": "{0}", + "params": [ + "/graph/uri=@id/prefLabel" + ] + }, + "vocabularyName": { + "pattern": "{0}", + "params": [ + "/graph/type=skos:ConceptScheme/label" + ] + }, + "vocabularyUri": { + "pattern": "{0}", + "params": [ + "/graph/type=skos:ConceptScheme/uri" + ] + } + } + } +] diff --git a/src/test/resources/json/cvoc-dans-config/audience.json b/src/test/resources/json/cvoc-dans-config/audience.json new file mode 100644 index 00000000000..26db1d38711 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-config/audience.json @@ -0,0 +1,53 @@ +[ + { + "field-name": "dansAudience", + "term-uri-field": "dansAudience", + "cvoc-url": "https://dev.vocabs.datastations.nl/", + "js-url": "https://github.com/gdcc/dataverse-external-vocab-support/blob/main/scripts/skosmos.js", + "protocol": "skosmos", + "retrieval-uri": "https://dev.vocabs.datastations.nl/rest/v1/data?uri={0}", + "term-parent-uri": "", + "languages": "en, nl", + "allow-free-text": false, + "vocabs": { + "NARCIS": { + "vocabularyUri": "https://www.narcis.nl/classification/", + "uriSpace": "https://www.narcis.nl/classification/" + } + }, + "managed-fields": {}, + "retrieval-filtering": { + "@context": { + "termName": "https://schema.org/name", + "vocabularyName": "https://dataverse.org/schema/vocabularyName", + "vocabularyUri": "https://dataverse.org/schema/vocabularyUri", + "lang": "@language", + "value": "@value" + }, + "@id": { + "pattern": "{0}", + "params": [ + "@id" + ] + }, + "termName": { + "pattern": "{0}", + "params": [ + "/graph/uri=@id/prefLabel" + ] + }, + "vocabularyName": { + "pattern": "{0}", + "params": [ + "/graph/type=skos:ConceptScheme/label" + ] + }, + "vocabularyUri": { + "pattern": "{0}", + "params": [ + "/graph/type=skos:ConceptScheme/uri" + ] + } + } + } +] diff --git a/src/test/resources/json/cvoc-dans-config/collection.json b/src/test/resources/json/cvoc-dans-config/collection.json new file mode 100644 index 00000000000..798b93cd646 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-config/collection.json @@ -0,0 +1,53 @@ +[ + { + "field-name": "dansCollection", + "term-uri-field": "dansCollection", + "cvoc-url": "https://dev.vocabs.datastations.nl/", + "js-url": "/custom/skosmos.js", + "protocol": "skosmos", + "retrieval-uri": "https://dev.vocabs.datastations.nl/rest/v1/data?uri={0}", + "term-parent-uri": "https://vocabularies.dans.knaw.nl/collections/archaeology", + "languages": "nl", + "allow-free-text": false, + "vocabs": { + "DansCollections": { + "vocabularyUri": "https://vocabularies.dans.knaw.nl/collections", + "uriSpace": "https://vocabularies.dans.knaw.nl/collections" + } + }, + "managed-fields": {}, + "retrieval-filtering": { + "@context": { + "termName": "https://schema.org/name", + "vocabularyName": "https://dataverse.org/schema/vocabularyName", + "vocabularyUri": "https://dataverse.org/schema/vocabularyUri", + "lang": "@language", + "value": "@value" + }, + "@id": { + "pattern": "{0}", + "params": [ + "@id" + ] + }, + "termName": { + "pattern": "{0}", + "params": [ + "/graph/uri=@id/prefLabel" + ] + }, + "vocabularyName": { + "pattern": "{0}", + "params": [ + "/graph/type=skos:ConceptScheme/label" + ] + }, + "vocabularyUri": { + "pattern": "{0}", + "params": [ + "/graph/type=skos:ConceptScheme/uri" + ] + } + } + } +] diff --git a/src/test/resources/json/cvoc-dans-value/abrArtifact.json b/src/test/resources/json/cvoc-dans-value/abrArtifact.json new file mode 100644 index 00000000000..44cbd629537 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-value/abrArtifact.json @@ -0,0 +1,167 @@ +{ + "@context": { + "skos": "http://www.w3.org/2004/02/skos/core#", + "isothes": "http://purl.org/iso25964/skos-thes#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "owl": "http://www.w3.org/2002/07/owl#", + "dct": "http://purl.org/dc/terms/", + "dc11": "http://purl.org/dc/elements/1.1/", + "uri": "@id", + "type": "@type", + "lang": "@language", + "value": "@value", + "graph": "@graph", + "label": "rdfs:label", + "prefLabel": "skos:prefLabel", + "altLabel": "skos:altLabel", + "hiddenLabel": "skos:hiddenLabel", + "broader": "skos:broader", + "narrower": "skos:narrower", + "related": "skos:related", + "inScheme": "skos:inScheme", + "exactMatch": "skos:exactMatch", + "closeMatch": "skos:closeMatch", + "broadMatch": "skos:broadMatch", + "narrowMatch": "skos:narrowMatch", + "relatedMatch": "skos:relatedMatch" + }, + "graph": [ + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/4d2b6f51-c9bc-42c7-ad1f-8b7022fa3953", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#MaterialAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": [ + { + "lang": "en", + "value": "flint" + }, + { + "lang": "nl", + "value": "vuursteen" + } + ], + "https://data.cultureelerfgoed.nl/id/rnce#isMaterialAbrOf": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/d252345b-3dd8-4afe-85fc-d8bef7c5cb0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/50916375-b4c8-4afb-949f-244755e2afa4", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "narrower": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/d252345b-3dd8-4afe-85fc-d8bef7c5cb0f" + }, + "prefLabel": { + "lang": "nl", + "value": "steker" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/8d762bf7-bda3-4c07-b77f-5df51301ad3f", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#PeriodAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "Paleolithicum" + }, + "https://data.cultureelerfgoed.nl/id/rnce#isBeginPeriodAbrOf": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/d252345b-3dd8-4afe-85fc-d8bef7c5cb0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/8d85b35a-7497-4b14-af54-a35648bce535", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#MaterialAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "zandsteen/kwartsiet" + }, + "https://data.cultureelerfgoed.nl/id/rnce#isMaterialAbrOf": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/d252345b-3dd8-4afe-85fc-d8bef7c5cb0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/c6134150-77f2-481b-bba6-c482e59046e8", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#PeriodAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "Neolithicum" + }, + "https://data.cultureelerfgoed.nl/id/rnce#isEndPeriodAbrOf": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/d252345b-3dd8-4afe-85fc-d8bef7c5cb0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/d252345b-3dd8-4afe-85fc-d8bef7c5cb0f", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "broader": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/50916375-b4c8-4afb-949f-244755e2afa4" + }, + "prefLabel": { + "lang": "nl", + "value": "A-steker" + }, + "skos:scopeNote": { + "lang": "nl", + "value": "Steker waarvan de werkkant het negatief van één stekerafslag (A is afslag) heeft." + }, + "https://data.cultureelerfgoed.nl/id/rnce#beginningOfValidity": { + "type": "http://www.w3.org/2001/XMLSchema#date", + "value": "2012-09-12" + }, + "https://data.cultureelerfgoed.nl/id/rnce#codeAbr": "STEKER.ASTEKER", + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/8d762bf7-bda3-4c07-b77f-5df51301ad3f" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/c6134150-77f2-481b-bba6-c482e59046e8" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasMaterialAbr": [ + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/4d2b6f51-c9bc-42c7-ad1f-8b7022fa3953" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/8d85b35a-7497-4b14-af54-a35648bce535" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/db8feb21-8ddc-432f-8062-a3a15f7f7cf4" + } + ] + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/db8feb21-8ddc-432f-8062-a3a15f7f7cf4", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#MaterialAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "steen" + }, + "https://data.cultureelerfgoed.nl/id/rnce#isMaterialAbrOf": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/d252345b-3dd8-4afe-85fc-d8bef7c5cb0f" + } + } + ] +} \ No newline at end of file diff --git a/src/test/resources/json/cvoc-dans-value/abrComplex.json b/src/test/resources/json/cvoc-dans-value/abrComplex.json new file mode 100644 index 00000000000..78a3ea41551 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-value/abrComplex.json @@ -0,0 +1,64 @@ +{ + "@context": { + "skos": "http://www.w3.org/2004/02/skos/core#", + "isothes": "http://purl.org/iso25964/skos-thes#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "owl": "http://www.w3.org/2002/07/owl#", + "dct": "http://purl.org/dc/terms/", + "dc11": "http://purl.org/dc/elements/1.1/", + "uri": "@id", + "type": "@type", + "lang": "@language", + "value": "@value", + "graph": "@graph", + "label": "rdfs:label", + "prefLabel": "skos:prefLabel", + "altLabel": "skos:altLabel", + "hiddenLabel": "skos:hiddenLabel", + "broader": "skos:broader", + "narrower": "skos:narrower", + "related": "skos:related", + "inScheme": "skos:inScheme", + "exactMatch": "skos:exactMatch", + "closeMatch": "skos:closeMatch", + "broadMatch": "skos:broadMatch", + "narrowMatch": "skos:narrowMatch", + "relatedMatch": "skos:relatedMatch" + }, + "graph": [ + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/1b5b4dd1-f4f8-4e4c-9108-a6fb2c606cde", + "type": "skos:Concept", + "altLabel": { + "lang": "nl", + "value": "ringwalburcht" + }, + "broader": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/2179d872-888f-4807-a6d5-5e5afaa616c4" + }, + "hiddenLabel": { + "lang": "nl", + "value": "BEWV.WB" + }, + "prefLabel": { + "lang": "nl", + "value": "(ring)walburg" + }, + "skos:scopeNote": { + "lang": "nl", + "value": "Een door een stelsel van wallen en grachten omsloten ronde, ovale of hoefijzervormig ruimte met een binnenterrein met een diameter van ca. 100-300 m. De wallen hebben een gemiddelde hoogte van twee tot vier m. In de meeste gevallen zijn er geen aanwijzingen voor vaste bewoning en zijn er dientengevolge nauwelijks vondsten." + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/2179d872-888f-4807-a6d5-5e5afaa616c4", + "type": "skos:Concept", + "narrower": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/1b5b4dd1-f4f8-4e4c-9108-a6fb2c606cde" + }, + "prefLabel": { + "lang": "nl", + "value": "bewoning (inclusief verdediging)" + } + } + ] +} \ No newline at end of file diff --git a/src/test/resources/json/cvoc-dans-value/abrPeriod.json b/src/test/resources/json/cvoc-dans-value/abrPeriod.json new file mode 100644 index 00000000000..045b4515b24 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-value/abrPeriod.json @@ -0,0 +1,1535 @@ +{ + "@context": { + "skos": "http://www.w3.org/2004/02/skos/core#", + "isothes": "http://purl.org/iso25964/skos-thes#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "owl": "http://www.w3.org/2002/07/owl#", + "dct": "http://purl.org/dc/terms/", + "dc11": "http://purl.org/dc/elements/1.1/", + "uri": "@id", + "type": "@type", + "lang": "@language", + "value": "@value", + "graph": "@graph", + "label": "rdfs:label", + "prefLabel": "skos:prefLabel", + "altLabel": "skos:altLabel", + "hiddenLabel": "skos:hiddenLabel", + "broader": "skos:broader", + "narrower": "skos:narrower", + "related": "skos:related", + "inScheme": "skos:inScheme", + "exactMatch": "skos:exactMatch", + "closeMatch": "skos:closeMatch", + "broadMatch": "skos:broadMatch", + "narrowMatch": "skos:narrowMatch", + "relatedMatch": "skos:relatedMatch" + }, + "graph": [ + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/02aea074-a4a9-4335-9698-bec9a188964e", + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/05a1149d-6410-4fc7-9b11-318235dc2878", + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/08d13f7f-7ba9-4037-a45d-b0cb33e7b0c3", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "bolpot" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/09991368-af46-4512-93b4-d56bdd94837a", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "amulet - alsengemme" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/0b585fbe-caf8-49e6-bd2c-ed8f034ef036", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "Cruciformfibula" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/0fd16779-7c72-46e6-a27b-7c1aec917be5", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "heiligenfibula geemailleerd" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/108f7a1d-c8ce-4c55-ab4f-663998dd6bb8", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "pseudomuntfibula" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/137bcf48-93d8-486a-9eba-6d872e30ad63", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "mayenaardewerk" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/1444787e-5d77-48e9-a931-3b7bf4008ad1", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "pingsdorfaardewerk:kom" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/17eeedcd-2e80-414b-9059-4fceccc13706", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "haarnaald - bolle kop" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/1a663a6d-dced-4509-9657-13ac276e425d", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "karolingisch grijsbakkend aardewerk" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/1c1399bf-e2d4-4481-9aca-ce507c537dbc", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "kogelpot:type Dorestad (ongeprofileerd) - Dorestad HIB:schelpgruismagering" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/1cd83c1e-ba0d-4924-af28-e654ee904e0a", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "Walberberg aardewerk" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/1e359798-2abf-4f91-b89e-ed434056cd09", + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/1f218dac-6129-49e2-938d-efcecdff3c0b", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "haarnaald - polyederkop" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/1f784bad-306c-4ce1-95e4-06b6023b05d2", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "geelwitbakkend gedraaid:beker" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/21196e10-6491-4a71-b21c-ca9c3fb50485", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "bommeloorring" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/2922d4d2-e335-4a47-88bb-28cbfd91d9b9", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "geelwitbakkend handgevormd:kom" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/29c3c134-1020-4239-b257-f2fab3e04e49", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "zalfdoos" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/29c66ad6-242c-4add-87aa-3124abd6b59c", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "Andenne:pot, bolvormig" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/2a0729f1-99cd-466b-94a3-eda91ffb8a8e", + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/2e364fe9-3e01-4085-a442-7282e4659dc9", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "dirhan" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/2f85a3d3-650e-45e7-8e53-b11aae1441de", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "Zuid-Limburg handgevormd aardewerk" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/35a3199d-c5c6-495b-9cde-c10bf1fc0d63", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "solidus" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/3acdd8c3-dd4b-4225-b531-c6d500a6f7dd", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "kogelpot:type Dorestad (ongeprofileerd)" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/3b9e2c46-9497-461a-90a3-16c944c76963", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "kom - Dorestad HIV:inbuigende rand" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/3ca651bd-1e93-42cf-96bb-e3edc5c488da", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "kogelpot:verticale,hoog opgetrokken rand" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/44bad953-f272-4ec3-b000-ea5338d5fbc8", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "Vikingzwaard:typen Wheeler V-VII" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/4567e775-3216-438b-aa59-39b0e100ec5a", + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/46be796a-1f10-4f4c-9eb6-520d7cfc375e", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "duisburg aardewerk" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/49cefc62-894c-4939-8bc9-a6c36c01a560", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "Noordfrans geelwitbakkend:tuitpot" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/4ae1dd58-d9f6-46f0-9882-b3c5f22dc6bc", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "kogelpot:type Dorestad (ongeprofileerd) - Dorestad HIA:kleine variant" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/4c74f143-c15f-418d-8451-dbec8c80899d", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "badorfaardewerk" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f", + "type": [ + "skos:Concept", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "https://data.cultureelerfgoed.nl/id/rnce#PeriodAbr" + ], + "altLabel": { + "lang": "nl", + "value": "Ottoons" + }, + "broader": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/ae70e517-2662-49ea-a1be-eca52b2d218e" + }, + "skos:hiddelLabel": { + "lang": "nl", + "value": "MEVD" + }, + "prefLabel": { + "lang": "nl", + "value": "Vroege Middeleeuwen D" + }, + "skos:scopeNote": { + "lang": "nl", + "value": "De periode tussen 900 en 1050, ruwweg gebaseerd op de datering van de overheersing door de dynastie van Ottoonse koningen en de keizers van het Oost-Frankische Rijk, waartoe Nederland ook behoorde." + }, + "https://data.cultureelerfgoed.nl/id/rnce#beginYearAbr": 900, + "https://data.cultureelerfgoed.nl/id/rnce#codeAbr": { + "lang": "nl", + "value": "MEVD" + }, + "https://data.cultureelerfgoed.nl/id/rnce#endYearAbr": 1049, + "https://data.cultureelerfgoed.nl/id/rnce#isBeginPeriodAbrOf": [ + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/bc6d9959-73b0-4430-a86b-e326fe87e336" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/5e771043-c208-47f4-99b7-1641af0b4d76" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/2922d4d2-e335-4a47-88bb-28cbfd91d9b9" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/add9f8ad-2284-4511-8275-0c5bc795c0cd" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/1f784bad-306c-4ce1-95e4-06b6023b05d2" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/6284d339-beb9-463a-84ff-4d451ced4e24" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/59b28798-377f-4010-acb0-c6a804ec3097" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/d57765d0-22bf-4cc4-8c97-232d042b7df3" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/88e76597-965f-432f-b25c-b4fa108eca84" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/bae2fb38-a77d-408a-b1bb-69ddd3594a63" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/49cefc62-894c-4939-8bc9-a6c36c01a560" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/925c2604-b8fa-4a45-be0a-7d146f675ae7" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/60385fad-ddc7-4af1-b2f8-f14b41cd0456" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/c82986f1-cef5-44b0-9465-7e6a8ff06409" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/75bc1be1-a218-4f4a-9fa8-c6c2aa864c9d" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/60c3498d-7527-4684-97e2-8aeb9ec2e173" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/29c66ad6-242c-4add-87aa-3124abd6b59c" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/2f85a3d3-650e-45e7-8e53-b11aae1441de" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/7573b80c-562c-42f1-acee-dbe9d2011ab7" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/1444787e-5d77-48e9-a931-3b7bf4008ad1" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/88d09cbd-0743-4fbe-bb5d-af7b62be4651" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/a482c1b9-12bc-40ef-9a15-20040b340cd1" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/782c60cd-a98e-4c4b-b51f-e8150486af72" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/9a99163b-c22d-48d6-9ded-ef0112de8524" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/ec2c5349-a70b-4334-80c5-fc41de29d979" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/eeecb436-c8c7-445c-a89b-4e66ee74fe8e" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/46be796a-1f10-4f4c-9eb6-520d7cfc375e" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/5eca7ed8-bfca-450a-bfa7-e2b5e654e9c4" + } + ], + "https://data.cultureelerfgoed.nl/id/rnce#isEndPeriodAbrOf": [ + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/2e364fe9-3e01-4085-a442-7282e4659dc9" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/108f7a1d-c8ce-4c55-ab4f-663998dd6bb8" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/dbb05ee3-b8dc-4e86-ba79-c320b364147d" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/3b9e2c46-9497-461a-90a3-16c944c76963" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/09991368-af46-4512-93b4-d56bdd94837a" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/c74a1b87-4013-4516-91df-209009d28d9e" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/bc6d9959-73b0-4430-a86b-e326fe87e336" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/be3776d9-72da-4283-9b31-e7c10c1950b3" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/b555ce1c-fb08-44d4-9f81-87a262b16329" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/0fd16779-7c72-46e6-a27b-7c1aec917be5" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/21196e10-6491-4a71-b21c-ca9c3fb50485" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/44bad953-f272-4ec3-b000-ea5338d5fbc8" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/e7eb705b-5992-4fcb-9f1a-d68073f906ad" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/c9f89fa4-debb-4461-a8cf-5d3a4788ff7e" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/aea78d62-4d84-45ae-9d16-3b75452d4abe" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/82bb0d14-3cd0-4be9-a80f-97e7f18b97c3" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/3ca651bd-1e93-42cf-96bb-e3edc5c488da" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/642113ae-8045-4183-bda9-e11dbdbc0182" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/af72712e-c721-4d7c-884f-4f7ff0e838e2" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/1c1399bf-e2d4-4481-9aca-ce507c537dbc" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/4ae1dd58-d9f6-46f0-9882-b3c5f22dc6bc" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/ef22ff5e-4667-4e6f-be61-eda1a50006f5" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/3acdd8c3-dd4b-4225-b531-c6d500a6f7dd" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/77883f24-528e-4891-8513-2ccccaa22dcb" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/0b585fbe-caf8-49e6-bd2c-ed8f034ef036" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/942c5c6f-f1f2-4443-a1d8-b22376c276c4" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/ad921750-046f-4e9c-8cc4-d79f5c6c201e" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/6e6b2f8e-8841-453f-a374-76e9ed458b5e" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/35a3199d-c5c6-495b-9cde-c10bf1fc0d63" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/dae339a1-7021-4c1d-bc1a-66625f6a96f3" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/76d45cf1-4391-404c-8c8f-e9152fd70203" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/ba62ecc3-2dc8-4f2c-99a5-6cbd448d7bfe" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/17eeedcd-2e80-414b-9059-4fceccc13706" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/fc399356-62df-4a0b-9ac7-eeca9ab4dcf0" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/1f218dac-6129-49e2-938d-efcecdff3c0b" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/57f8e38c-58ff-4d02-817d-a668466057ec" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/ab81b9b2-53f5-496b-995a-fd81b851aba2" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/9a119be1-0225-4795-a1fb-fa782548bfb2" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/fab8ad7a-588b-4370-9a80-b73735732847" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/f8d93a84-153a-4079-97e2-6f85d234441e" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/29c3c134-1020-4239-b257-f2fab3e04e49" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/08d13f7f-7ba9-4037-a45d-b0cb33e7b0c3" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/56ecd5d7-2591-416f-99f1-c227ed8650d9" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/c18ecbf9-f787-4e38-854d-32df989d9eb7" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/53611175-c12c-4520-adca-437899332c24" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/1cd83c1e-ba0d-4924-af28-e654ee904e0a" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/1a663a6d-dced-4509-9657-13ac276e425d" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/137bcf48-93d8-486a-9eba-6d872e30ad63" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/4c74f143-c15f-418d-8451-dbec8c80899d" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/46be796a-1f10-4f4c-9eb6-520d7cfc375e" + } + ], + "https://data.cultureelerfgoed.nl/id/rnce#sortPeriod": "caad" + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/53611175-c12c-4520-adca-437899332c24", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "badorfaardewerk (Hunneschans-type)" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/56ecd5d7-2591-416f-99f1-c227ed8650d9", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "kogelpotaardewerk schelgruismagering" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/57f8e38c-58ff-4d02-817d-a668466057ec", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "penslot" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/59b28798-377f-4010-acb0-c6a804ec3097", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "geelwitbakkend gedraaid:pot, bolvormig" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/5e771043-c208-47f4-99b7-1641af0b4d76", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "pothelm" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/5eca7ed8-bfca-450a-bfa7-e2b5e654e9c4", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "pingsdorfaardewerk" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/60385fad-ddc7-4af1-b2f8-f14b41cd0456", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "Noordfrans geelwitbakkend:kan" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/60c3498d-7527-4684-97e2-8aeb9ec2e173", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "Andenne:tuitpot" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/6284d339-beb9-463a-84ff-4d451ced4e24", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "geelwitbakkend handgevormd:pot, bolvorm. - Zuidlimburgs" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/642113ae-8045-4183-bda9-e11dbdbc0182", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "kogelpot:type Dorestad (ongeprofileerd) - Dorestad HIC" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/6e6b2f8e-8841-453f-a374-76e9ed458b5e", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "weefgewicht - ringvormig" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/70df9b2f-b8ac-43c0-8d27-f3c998b61a29", + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/7573b80c-562c-42f1-acee-dbe9d2011ab7", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "Zuid-Limburg gedraaid aardewerk" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/75bc1be1-a218-4f4a-9fa8-c6c2aa864c9d", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "geelwitbakkend gedraaid:tuitpot" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/76d45cf1-4391-404c-8c8f-e9152fd70203", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "fibula - geemailleerd" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/77883f24-528e-4891-8513-2ccccaa22dcb", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "kogelpot:horizontale rand,ongeprofileerd" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/782c60cd-a98e-4c4b-b51f-e8150486af72", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "pingsdorfaardewerk:tuitpot" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/7e9f750d-2331-4342-9577-4ba1b1d98ea3", + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/82bb0d14-3cd0-4be9-a80f-97e7f18b97c3", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "slijpsteen - doorboord" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/88d09cbd-0743-4fbe-bb5d-af7b62be4651", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "pingsdorfaardewerk:beker" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/88e76597-965f-432f-b25c-b4fa108eca84", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "kogelpot - Kempische variant" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/925c2604-b8fa-4a45-be0a-7d146f675ae7", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "geelwitbakkend gedraaid:kan" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/942c5c6f-f1f2-4443-a1d8-b22376c276c4", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "gelijkarmige fibula" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/9a119be1-0225-4795-a1fb-fa782548bfb2", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "umbo" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/9a99163b-c22d-48d6-9ded-ef0112de8524", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "pingsdorfaardewerk:kan" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/a482c1b9-12bc-40ef-9a15-20040b340cd1", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "pingsdorfaardewerk:pot" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/a627267f-67f1-454a-a9f8-daf4e281993c", + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/a9003966-105f-477a-8840-04f61b962b11", + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/ab81b9b2-53f5-496b-995a-fd81b851aba2", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "handgreep" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/ad921750-046f-4e9c-8cc4-d79f5c6c201e", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "schijffibula" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/add9f8ad-2284-4511-8275-0c5bc795c0cd", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "geelwitbakkend handgevormd:kom - Zuidlimburgs" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/ae70e517-2662-49ea-a1be-eca52b2d218e", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#PeriodAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "narrower": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + }, + "prefLabel": { + "lang": "nl", + "value": "Vroege Middeleeuwen" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/aea78d62-4d84-45ae-9d16-3b75452d4abe", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "steelpan - Dorestad HII" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/af72712e-c721-4d7c-884f-4f7ff0e838e2", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "kogelpot:type Dorestad (ongeprofileerd) - Dorestad HIA" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/b555ce1c-fb08-44d4-9f81-87a262b16329", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "schijffibula - Maltezer kruis" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/ba62ecc3-2dc8-4f2c-99a5-6cbd448d7bfe", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "schijffibula - geemailleerd" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/bae2fb38-a77d-408a-b1bb-69ddd3594a63", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "kogelpot - tuitvormige oren" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/bc6d9959-73b0-4430-a86b-e326fe87e336", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "oorring - Byzantijns" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/be3776d9-72da-4283-9b31-e7c10c1950b3", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "pseudokameefibula" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/c18ecbf9-f787-4e38-854d-32df989d9eb7", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "Badorf aardewerk - Dorestad WII A-E:eivormig/radstempel" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/c74a1b87-4013-4516-91df-209009d28d9e", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "runenstaaf" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/c82986f1-cef5-44b0-9465-7e6a8ff06409", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "geelwitbakkend gedraaid:kom" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/c9f89fa4-debb-4461-a8cf-5d3a4788ff7e", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "Badorf aardewerk - Dorestad WI/II:Badorfhybride" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/d57765d0-22bf-4cc4-8c97-232d042b7df3", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "geelwitbakkend handgevormd:pot, bolvorm." + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/dae339a1-7021-4c1d-bc1a-66625f6a96f3", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "munthanger" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/dbb05ee3-b8dc-4e86-ba79-c320b364147d", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "kruisvormige fibula" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/e7eb705b-5992-4fcb-9f1a-d68073f906ad", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "Badorf aardewerk - reliefbandamfoor:Dorestad WI A-C" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/ec2c5349-a70b-4334-80c5-fc41de29d979", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "pingsdorfaardewerk (Zuid-Limburg type)" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/eeecb436-c8c7-445c-a89b-4e66ee74fe8e", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", + "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "witbakkend Maaslands aardewerk" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/ef22ff5e-4667-4e6f-be61-eda1a50006f5", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "kogelpot - versierd en eenvoudig randprofiel" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/f8d93a84-153a-4079-97e2-6f85d234441e", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "weefgewicht - kegelvormig" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/f9c4e8e1-4f8f-46c0-aed4-a75dda88ee60", + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/fab8ad7a-588b-4370-9a80-b73735732847", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "beslag (schildonderdeel)" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/fc399356-62df-4a0b-9ac7-eeca9ab4dcf0", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "prefLabel": { + "lang": "nl", + "value": "haarnaald - biconische kop" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f" + } + } + ] +} \ No newline at end of file diff --git a/src/test/resources/json/cvoc-dans-value/abrRapportType.json b/src/test/resources/json/cvoc-dans-value/abrRapportType.json new file mode 100644 index 00000000000..034c4f5db60 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-value/abrRapportType.json @@ -0,0 +1,53 @@ +{ + "@context": { + "skos": "http://www.w3.org/2004/02/skos/core#", + "isothes": "http://purl.org/iso25964/skos-thes#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "owl": "http://www.w3.org/2002/07/owl#", + "dct": "http://purl.org/dc/terms/", + "dc11": "http://purl.org/dc/elements/1.1/", + "uri": "@id", + "type": "@type", + "lang": "@language", + "value": "@value", + "graph": "@graph", + "label": "rdfs:label", + "prefLabel": "skos:prefLabel", + "altLabel": "skos:altLabel", + "hiddenLabel": "skos:hiddenLabel", + "broader": "skos:broader", + "narrower": "skos:narrower", + "related": "skos:related", + "inScheme": "skos:inScheme", + "exactMatch": "skos:exactMatch", + "closeMatch": "skos:closeMatch", + "broadMatch": "skos:broadMatch", + "narrowMatch": "skos:narrowMatch", + "relatedMatch": "skos:relatedMatch" + }, + "graph": [ + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/5701cb3d-0ffd-4663-98e0-fab808448109", + "type": "skos:Concept", + "broader": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/7a99aaba-c1e7-49a4-9dd8-d295dbcc870e" + }, + "skos:notation": "AAP", + "prefLabel": { + "lang": "nl", + "value": "Achterhoekse Archeologische Publicaties" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/7a99aaba-c1e7-49a4-9dd8-d295dbcc870e", + "type": "skos:Concept", + "narrower": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/5701cb3d-0ffd-4663-98e0-fab808448109" + }, + "prefLabel": { + "lang": "nl", + "value": "rapporten" + } + } + ] +} \ No newline at end of file diff --git a/src/test/resources/json/cvoc-dans-value/abrVerwervingswijze.json b/src/test/resources/json/cvoc-dans-value/abrVerwervingswijze.json new file mode 100644 index 00000000000..97bbf047c66 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-value/abrVerwervingswijze.json @@ -0,0 +1,65 @@ +{ + "@context": { + "skos": "http://www.w3.org/2004/02/skos/core#", + "isothes": "http://purl.org/iso25964/skos-thes#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "owl": "http://www.w3.org/2002/07/owl#", + "dct": "http://purl.org/dc/terms/", + "dc11": "http://purl.org/dc/elements/1.1/", + "uri": "@id", + "type": "@type", + "lang": "@language", + "value": "@value", + "graph": "@graph", + "label": "rdfs:label", + "prefLabel": "skos:prefLabel", + "altLabel": "skos:altLabel", + "hiddenLabel": "skos:hiddenLabel", + "broader": "skos:broader", + "narrower": "skos:narrower", + "related": "skos:related", + "inScheme": "skos:inScheme", + "exactMatch": "skos:exactMatch", + "closeMatch": "skos:closeMatch", + "broadMatch": "skos:broadMatch", + "narrowMatch": "skos:narrowMatch", + "relatedMatch": "skos:relatedMatch" + }, + "graph": [ + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/7a2a5dd7-4c94-4c79-b90e-e9eb13c905c9", + "type": [ + "https://data.cultureelerfgoed.nl/id/rnce#AquisitionMethodAbr", + "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", + "skos:Concept" + ], + "narrower": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/b7f4fe13-d7b4-4fb9-a7a8-c25ef74b612d" + }, + "prefLabel": { + "lang": "nl", + "value": "non-destructief" + } + }, + { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/b7f4fe13-d7b4-4fb9-a7a8-c25ef74b612d", + "type": "skos:Concept", + "altLabel": { + "lang": "nl", + "value": "boring" + }, + "broader": { + "uri": "https://data.cultureelerfgoed.nl/term/id/abr/7a2a5dd7-4c94-4c79-b90e-e9eb13c905c9" + }, + "prefLabel": { + "lang": "nl", + "value": "archeologisch: booronderzoek" + }, + "skos:scopeNote": { + "lang": "nl", + "value": "Door archeologisch booronderzoek verkregen archeologische informatie volgens Protocol 4003 Inventariserend veldonderzoek (IVO-O: VS03) KNA 4.1" + }, + "https://data.cultureelerfgoed.nl/id/rnce#codeAbr": "ABO" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/json/cvoc-dans-value/audience.json b/src/test/resources/json/cvoc-dans-value/audience.json new file mode 100644 index 00000000000..ee0dbdb00f6 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-value/audience.json @@ -0,0 +1,88 @@ +{ + "@context": { + "skos": "http://www.w3.org/2004/02/skos/core#", + "isothes": "http://purl.org/iso25964/skos-thes#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "owl": "http://www.w3.org/2002/07/owl#", + "dct": "http://purl.org/dc/terms/", + "dc11": "http://purl.org/dc/elements/1.1/", + "uri": "@id", + "type": "@type", + "lang": "@language", + "value": "@value", + "graph": "@graph", + "label": "rdfs:label", + "prefLabel": "skos:prefLabel", + "altLabel": "skos:altLabel", + "hiddenLabel": "skos:hiddenLabel", + "broader": "skos:broader", + "narrower": "skos:narrower", + "related": "skos:related", + "inScheme": "skos:inScheme", + "exactMatch": "skos:exactMatch", + "closeMatch": "skos:closeMatch", + "broadMatch": "skos:broadMatch", + "narrowMatch": "skos:narrowMatch", + "relatedMatch": "skos:relatedMatch" + }, + "graph": [ + { + "uri": "https://www.narcis.nl/classification/", + "type": "skos:ConceptScheme", + "label": [ + { + "lang": "nl", + "value": "Classificatiecodes van de wetenschapsportal Narcis (www.narcis.nl). De Narcis Classificatie is een schema van codes\n waarmee experts en onderzoeksorganisaties kunnen worden ingedeeld en teruggevonden. De D-code rubriceert de wetenschappelijke disciplines.\n Daarnaast bevat de classificatie een E-code. Deze code omvat een aantal interdisciplinaire onderzoeksgebieden. De Narcis Classificatie is\n in 2015 herzien." + }, + { + "lang": "en", + "value": "Classification codes of the scientific portal Narcis (www.narcis.nl). The Narcis Classification is a framework of codes with which\n institutes and experts are classified and can be retrieved. The D code classifies on scientific disciplines. The classification also\n contains an E code. This code includes some interdisciplinary research fields. The Narcis Classification has been revised in the year\n 2015." + } + ] + }, + { + "uri": "https://www.narcis.nl/classification/D13000", + "type": "skos:Concept", + "prefLabel": [ + { + "lang": "nl", + "value": "Scheikunde" + }, + { + "lang": "en", + "value": "Chemistry" + } + ] + }, + { + "uri": "https://www.narcis.nl/classification/D13700", + "type": "skos:Concept", + "broader": { + "uri": "https://www.narcis.nl/classification/D13000" + }, + "hiddenLabel": [ + { + "lang": "nl", + "value": "D13700" + }, + { + "lang": "en", + "value": "D13700" + } + ], + "inScheme": { + "uri": "https://www.narcis.nl/classification/" + }, + "prefLabel": [ + { + "lang": "en", + "value": "Theoretical chemistry, quantum chemistry" + }, + { + "lang": "nl", + "value": "Theoretische chemie, kwantumchemie" + } + ] + } + ] +} \ No newline at end of file From 8dcb065ebd04f64c2516ca05184502b52f8231a4 Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Tue, 22 Apr 2025 09:44:41 -0400 Subject: [PATCH 007/470] fix test --- src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java index 91246552886..81acfe67b6e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java @@ -3255,7 +3255,7 @@ public void testUpdateWithEmptyFieldsAndVersionCheck() { .add(OptionalFileParams.PROVENANCE_FREEFORM_ATTR_NAME, "") .add(OptionalFileParams.CATEGORIES_ATTR_NAME, Json.createArrayBuilder()) .add(OptionalFileParams.FILE_DATA_TAGS_ATTR_NAME, Json.createArrayBuilder()); - Response updateResponse = UtilIT.updateFileMetadata(String.valueOf(fileId), json.build().toString(), apiToken, datasetVersionId); + Response updateResponse = UtilIT.updateFileMetadata(String.valueOf(fileId), json.build().toString(), apiToken); updateResponse.prettyPrint(); updateResponse.then().assertThat().statusCode(OK.getStatusCode()); From 2fce5fdc7498f83945dff07961d152913b96b2dd Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Tue, 22 Apr 2025 13:49:04 -0400 Subject: [PATCH 008/470] add to test --- .../java/edu/harvard/iq/dataverse/api/FilesIT.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java index 81acfe67b6e..60a65418a7a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java @@ -3280,5 +3280,16 @@ public void testUpdateWithEmptyFieldsAndVersionCheck() { .body("status", equalTo(ApiConstants.STATUS_ERROR)) .body("message", equalTo(BundleUtil.getStringFromBundle("file.metadata.message.parallelUpdateError"))) .statusCode(BAD_REQUEST.getStatusCode()); + + // Second user refreshes and updates. Should pass now + getFile = UtilIT.getFileData(String.valueOf(fileId), apiToken); + getFile.prettyPrint(); + getFile.then().assertThat() + .statusCode(OK.getStatusCode()); + datasetVersionId = String.valueOf(JsonPath.from(getFile.body().asString()).getInt("data.datasetVersionId")); + updateResponse = UtilIT.updateFileMetadata(String.valueOf(fileId), json.build().toString(), apiToken, datasetVersionId); + updateResponse.prettyPrint(); + updateResponse.then().assertThat() + .statusCode(OK.getStatusCode()); } } From 26f07b726c2ccd48e395b8d4f9cd0e3b288e4427 Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Tue, 22 Apr 2025 17:13:17 -0400 Subject: [PATCH 009/470] adding info for debugging jenkins test failure --- src/main/java/edu/harvard/iq/dataverse/api/Files.java | 7 +++++-- src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Files.java b/src/main/java/edu/harvard/iq/dataverse/api/Files.java index cd106d728b1..4fd9a8eaf2d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Files.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Files.java @@ -430,8 +430,11 @@ public Response updateFileMetadata(@Context ContainerRequestContext crc, @FormDa } Long latestDatasetVersion = df.getFileMetadata().getDatasetVersion().getId(); - if (datasetVersionId != null && latestDatasetVersion != Long.valueOf(datasetVersionId)) { - return error(Response.Status.BAD_REQUEST, BundleUtil.getStringFromBundle("file.metadata.message.parallelUpdateError")); + if (datasetVersionId != null && latestDatasetVersion != null && + latestDatasetVersion != Long.valueOf(datasetVersionId)) { + return error(Response.Status.BAD_REQUEST, BundleUtil.getStringFromBundle("file.metadata.message.parallelUpdateError") + + " latestDatasetVersion:" + (latestDatasetVersion != null ? String.valueOf(latestDatasetVersion):"null") + + " datasetVersionId:" + datasetVersionId); } //You shouldn't be trying to edit a datafile that has been replaced diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java index 60a65418a7a..aca90f95bfe 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java @@ -3278,7 +3278,7 @@ public void testUpdateWithEmptyFieldsAndVersionCheck() { updateResponse.prettyPrint(); updateResponse.then().assertThat() .body("status", equalTo(ApiConstants.STATUS_ERROR)) - .body("message", equalTo(BundleUtil.getStringFromBundle("file.metadata.message.parallelUpdateError"))) + .body("message", startsWith(BundleUtil.getStringFromBundle("file.metadata.message.parallelUpdateError"))) .statusCode(BAD_REQUEST.getStatusCode()); // Second user refreshes and updates. Should pass now From 6873483444f4df07620eee03e080fb0cd22f640a Mon Sep 17 00:00:00 2001 From: jo-pol Date: Wed, 23 Apr 2025 14:01:42 +0200 Subject: [PATCH 010/470] unintended change --- .../java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java | 2 +- .../edu/harvard/iq/dataverse/DatasetFieldServiceBeanTest.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java index 3daf82dead7..260cbe36f9e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java @@ -716,7 +716,7 @@ else if (vals.get(0) instanceof JsonObject) { job.add(filterKey, result); logger.fine("Added : " + filterKey + ": " + result); } - } else { + } else if (nrOfNotFound == 0) { logger.warning("External Vocabulary: " + termUri + " - No value found for " + filterKey); } } else { diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanTest.java index 395b08f404e..873d417131d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanTest.java @@ -4,7 +4,6 @@ import java.io.File; import java.io.IOException; -import java.io.StringReader; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Collections; From 10939ce17d3501d91632efe3ad8b6a5f80b88772 Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Wed, 23 Apr 2025 09:08:09 -0400 Subject: [PATCH 011/470] remove jenkins debug --- src/main/java/edu/harvard/iq/dataverse/api/Files.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Files.java b/src/main/java/edu/harvard/iq/dataverse/api/Files.java index 4fd9a8eaf2d..fcbf6ef21e0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Files.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Files.java @@ -429,12 +429,10 @@ public Response updateFileMetadata(@Context ContainerRequestContext crc, @FormDa return error(BAD_REQUEST, "Error attempting get the requested data file."); } - Long latestDatasetVersion = df.getFileMetadata().getDatasetVersion().getId(); + String latestDatasetVersion = String.valueOf(df.getFileMetadata().getDatasetVersion().getId()); if (datasetVersionId != null && latestDatasetVersion != null && - latestDatasetVersion != Long.valueOf(datasetVersionId)) { - return error(Response.Status.BAD_REQUEST, BundleUtil.getStringFromBundle("file.metadata.message.parallelUpdateError") + - " latestDatasetVersion:" + (latestDatasetVersion != null ? String.valueOf(latestDatasetVersion):"null") + - " datasetVersionId:" + datasetVersionId); + !latestDatasetVersion.equals(datasetVersionId)) { + return error(Response.Status.BAD_REQUEST, BundleUtil.getStringFromBundle("file.metadata.message.parallelUpdateError")); } //You shouldn't be trying to edit a datafile that has been replaced From f5ddcff8a466122e2e2a11c7c521e18a21cd9209 Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Thu, 24 Apr 2025 10:43:08 -0400 Subject: [PATCH 012/470] per review comments --- doc/sphinx-guides/source/api/native-api.rst | 6 +++--- .../harvard/iq/dataverse/api/AbstractApiBean.java | 9 +++++++++ .../java/edu/harvard/iq/dataverse/api/Files.java | 12 +++++++----- src/main/java/propertyFiles/Bundle.properties | 2 +- .../java/edu/harvard/iq/dataverse/api/FilesIT.java | 2 +- .../java/edu/harvard/iq/dataverse/api/UtilIT.java | 2 +- 6 files changed, 22 insertions(+), 11 deletions(-) diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index 9bf7b3679bf..c397b967be3 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -4612,7 +4612,7 @@ Updating File Metadata Updates the file metadata for an existing file where ``ID`` is the database id of the file to update or ``PERSISTENT_ID`` is the persistent id (DOI or Handle) of the file. Requires a ``jsonString`` expressing the new metadata. No metadata from the previous version of this file will be persisted, so if you want to update a specific field first get the json with the above command and alter the fields you want. -Optional Parameter for verifying that the Dataset Version being edited is the latest version can be added &datasetVersionId=12345. This is to prevent stale data from being edited. +Optional Parameter for verifying that the Dataset Version being edited is the latest version can be added &sourceInternalVersionNumber=12345. This is to prevent stale data from being edited. The value for sourceInternalVersionNumber comes from ``datasetVersionId`` in the response to get $SERVER_URL/api/files/$ID API call A curl example using an ``ID`` @@ -4645,7 +4645,7 @@ A curl example using a ``PERSISTENT_ID`` curl -H "X-Dataverse-key:$API_TOKEN" -X POST \ -F 'jsonData={"description":"My description bbb.","provFreeform":"Test prov freeform","categories":["Data"],"dataFileTags":["Survey"],"restrict":false}' \ - "$SERVER_URL/api/files/:persistentId/metadata?persistentId=$PERSISTENT_ID&datasetVersionId=$VERSION_ID" + "$SERVER_URL/api/files/:persistentId/metadata?persistentId=$PERSISTENT_ID&sourceInternalVersionNumber=$VERSION_ID" The fully expanded example above (without environment variables) looks like this: @@ -4653,7 +4653,7 @@ The fully expanded example above (without environment variables) looks like this curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -X POST \ -F 'jsonData={"description":"My description bbb.","provFreeform":"Test prov freeform","categories":["Data"],"dataFileTags":["Survey"],"restrict":false}' \ - "https://demo.dataverse.org/api/files/:persistentId/metadata?persistentId=doi:10.5072/FK2/AAA000&datasetVersionId=12345" + "https://demo.dataverse.org/api/files/:persistentId/metadata?persistentId=doi:10.5072/FK2/AAA000&sourceInternalVersionNumber=12345" Note: To update the 'tabularTags' property of file metadata, use the 'dataFileTags' key when making API requests. This property is used to update the 'tabularTags' of the file metadata. diff --git a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java index 8841ce3563b..d6391133240 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java @@ -451,6 +451,15 @@ protected void validateInternalVersionNumberIsNotOutdated(Dataset dataset, int i } } + protected void validateInternalVersionNumberIsNotOutdated(DataFile dataFile, int internalVersion) throws WrappedResponse { + logger.severe(">>>> internalVersion:"+internalVersion+" dataFile.getFileMetadata().getDatasetVersion().getId():"+dataFile.getFileMetadata().getDatasetVersion().getId()); + if (dataFile.getFileMetadata().getDatasetVersion().getId() > internalVersion) { + throw new WrappedResponse( + badRequest(BundleUtil.getStringFromBundle("abstractApiBean.error.datafileInternalVersionNumberIsOutdated", Collections.singletonList(Integer.toString(internalVersion)))) + ); + } + } + protected DataFile findDataFileOrDie(String id) throws WrappedResponse { DataFile datafile; if (id.equals(PERSISTENT_ID_KEY)) { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Files.java b/src/main/java/edu/harvard/iq/dataverse/api/Files.java index fcbf6ef21e0..33b380df865 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Files.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Files.java @@ -410,7 +410,7 @@ public Response deleteFileInDataset(@Context ContainerRequestContext crc, @PathP @AuthRequired @Path("{id}/metadata") public Response updateFileMetadata(@Context ContainerRequestContext crc, @FormDataParam("jsonData") String jsonData, - @PathParam("id") String fileIdOrPersistentId, @QueryParam("datasetVersionId") String datasetVersionId + @PathParam("id") String fileIdOrPersistentId, @QueryParam("sourceInternalVersionNumber") Integer sourceInternalVersionNumber ) throws CommandException { FileMetadata upFmd = null; @@ -429,10 +429,12 @@ public Response updateFileMetadata(@Context ContainerRequestContext crc, @FormDa return error(BAD_REQUEST, "Error attempting get the requested data file."); } - String latestDatasetVersion = String.valueOf(df.getFileMetadata().getDatasetVersion().getId()); - if (datasetVersionId != null && latestDatasetVersion != null && - !latestDatasetVersion.equals(datasetVersionId)) { - return error(Response.Status.BAD_REQUEST, BundleUtil.getStringFromBundle("file.metadata.message.parallelUpdateError")); + if (sourceInternalVersionNumber != null) { + try { + validateInternalVersionNumberIsNotOutdated(df, sourceInternalVersionNumber); + } catch (WrappedResponse wr) { + return wr.getResponse(); + } } //You shouldn't be trying to edit a datafile that has been replaced diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index 18e2406c2a9..09ea8d2e378 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -1945,7 +1945,6 @@ file.metaData.dataFile.dataTab.unf=UNF file.metaData.dataFile.dataTab.variables=Variables file.metaData.dataFile.dataTab.observations=Observations file.metaData.fileAccess=File Access: -file.metadata.message.parallelUpdateError=Changes cannot be saved. This metadata has been edited since this page was opened. To continue, copy your changes, refresh the page to see the recent updates, and re-enter any changes you want to save. file.addDescription=Add file description... file.tags=Tags file.editTags=Edit Tags @@ -3206,3 +3205,4 @@ updateDatasetFieldsCommand.api.processDatasetUpdate.parseError=Error parsing dat #AbstractApiBean.java abstractApiBean.error.datasetInternalVersionNumberIsOutdated=Dataset internal version number {0} is outdated +abstractApiBean.error.datafileInternalVersionNumberIsOutdated=File Metadata internal version number {0} is outdated diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java index aca90f95bfe..d8d4cf80535 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java @@ -3278,7 +3278,7 @@ public void testUpdateWithEmptyFieldsAndVersionCheck() { updateResponse.prettyPrint(); updateResponse.then().assertThat() .body("status", equalTo(ApiConstants.STATUS_ERROR)) - .body("message", startsWith(BundleUtil.getStringFromBundle("file.metadata.message.parallelUpdateError"))) + .body("message", equalTo(BundleUtil.getStringFromBundle("abstractApiBean.error.datafileInternalVersionNumberIsOutdated",Collections.singletonList(datasetVersionId)))) .statusCode(BAD_REQUEST.getStatusCode()); // Second user refreshes and updates. Should pass now diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index 9a09a5edd9f..f9e97022d2e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -1100,7 +1100,7 @@ static Response updateFileMetadata(String fileIdOrPersistentId, String jsonAsStr optionalQueryParam = "?persistentId=" + fileIdOrPersistentId; } if (datasetVersionId != null) { - optionalQueryParam = optionalQueryParam + (optionalQueryParam.isEmpty() ? "?" : "&") + "datasetVersionId=" + datasetVersionId; + optionalQueryParam = optionalQueryParam + (optionalQueryParam.isEmpty() ? "?" : "&") + "sourceInternalVersionNumber=" + datasetVersionId; } RequestSpecification requestSpecification = given() .header(API_TOKEN_HTTP_HEADER, apiToken); From 1615fb91238a08194cf7ea9a760c177cfd2e5ddc Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Thu, 24 Apr 2025 10:44:18 -0400 Subject: [PATCH 013/470] per review comments --- src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java index d6391133240..7811eb68244 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java @@ -452,7 +452,6 @@ protected void validateInternalVersionNumberIsNotOutdated(Dataset dataset, int i } protected void validateInternalVersionNumberIsNotOutdated(DataFile dataFile, int internalVersion) throws WrappedResponse { - logger.severe(">>>> internalVersion:"+internalVersion+" dataFile.getFileMetadata().getDatasetVersion().getId():"+dataFile.getFileMetadata().getDatasetVersion().getId()); if (dataFile.getFileMetadata().getDatasetVersion().getId() > internalVersion) { throw new WrappedResponse( badRequest(BundleUtil.getStringFromBundle("abstractApiBean.error.datafileInternalVersionNumberIsOutdated", Collections.singletonList(Integer.toString(internalVersion)))) From 8a57fc8d9d5b7a346ea59bd471f42c3322d8acc6 Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Fri, 25 Apr 2025 11:02:11 -0400 Subject: [PATCH 014/470] refactor to use last update timestamp instead of version number --- .../11392-edit-file-metadata-empty-values.md | 2 +- doc/sphinx-guides/source/api/native-api.rst | 8 ++--- .../iq/dataverse/api/AbstractApiBean.java | 15 +++++++-- .../edu/harvard/iq/dataverse/api/Files.java | 6 ++-- .../iq/dataverse/util/json/JsonPrinter.java | 3 +- src/main/java/propertyFiles/Bundle.properties | 2 +- .../edu/harvard/iq/dataverse/api/FilesIT.java | 32 ++++++++++++------- .../edu/harvard/iq/dataverse/api/UtilIT.java | 6 ++-- 8 files changed, 47 insertions(+), 27 deletions(-) diff --git a/doc/release-notes/11392-edit-file-metadata-empty-values.md b/doc/release-notes/11392-edit-file-metadata-empty-values.md index e42bef13aec..652aea63aed 100644 --- a/doc/release-notes/11392-edit-file-metadata-empty-values.md +++ b/doc/release-notes/11392-edit-file-metadata-empty-values.md @@ -2,6 +2,6 @@ Previously the API POST /files/{id}/metadata would ignore fields with empty values. Now the API updates the fields with the empty values essentially clearing the data. Missing fields will still be ignored. -An optional query parameter was added to ensure the metadata update doesn't overwrite stale data. +An optional query parameter (sourceInternalVersionTimestamp) was added to ensure the metadata update doesn't overwrite stale data. See also [the guides](https://dataverse-guide--11359.org.readthedocs.build/en/11359/api/native-api.html#updating-file-metadata), #11392, and #11359. diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index c397b967be3..a27b7ae3269 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -4612,7 +4612,7 @@ Updating File Metadata Updates the file metadata for an existing file where ``ID`` is the database id of the file to update or ``PERSISTENT_ID`` is the persistent id (DOI or Handle) of the file. Requires a ``jsonString`` expressing the new metadata. No metadata from the previous version of this file will be persisted, so if you want to update a specific field first get the json with the above command and alter the fields you want. -Optional Parameter for verifying that the Dataset Version being edited is the latest version can be added &sourceInternalVersionNumber=12345. This is to prevent stale data from being edited. The value for sourceInternalVersionNumber comes from ``datasetVersionId`` in the response to get $SERVER_URL/api/files/$ID API call +Optional Parameter for verifying that the Dataset Version being edited is the latest version can be added &sourceInternalVersionTimestamp=datetime(in format: "yyyy-MM-dd'T'HH:mm:ss'Z'"). This is to prevent stale data from being edited. The value for sourceInternalVersionTimestamp comes from ``lastUpdateTime`` in the response to get $SERVER_URL/api/files/$ID API call A curl example using an ``ID`` @@ -4641,11 +4641,11 @@ A curl example using a ``PERSISTENT_ID`` export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx export SERVER_URL=https://demo.dataverse.org export PERSISTENT_ID=doi:10.5072/FK2/AAA000 - export VERSION_ID=12345 + export UPDATE_TIME=2025-04-25T13:58:28Z curl -H "X-Dataverse-key:$API_TOKEN" -X POST \ -F 'jsonData={"description":"My description bbb.","provFreeform":"Test prov freeform","categories":["Data"],"dataFileTags":["Survey"],"restrict":false}' \ - "$SERVER_URL/api/files/:persistentId/metadata?persistentId=$PERSISTENT_ID&sourceInternalVersionNumber=$VERSION_ID" + "$SERVER_URL/api/files/:persistentId/metadata?persistentId=$PERSISTENT_ID&sourceInternalVersionTimestamp=$UPDATE_TIME" The fully expanded example above (without environment variables) looks like this: @@ -4653,7 +4653,7 @@ The fully expanded example above (without environment variables) looks like this curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -X POST \ -F 'jsonData={"description":"My description bbb.","provFreeform":"Test prov freeform","categories":["Data"],"dataFileTags":["Survey"],"restrict":false}' \ - "https://demo.dataverse.org/api/files/:persistentId/metadata?persistentId=doi:10.5072/FK2/AAA000&sourceInternalVersionNumber=12345" + "https://demo.dataverse.org/api/files/:persistentId/metadata?persistentId=doi:10.5072/FK2/AAA000&sourceInternalVersionTimestamp=2025-04-25T13:58:28Z" Note: To update the 'tabularTags' property of file metadata, use the 'dataFileTags' key when making API requests. This property is used to update the 'tabularTags' of the file metadata. diff --git a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java index 7811eb68244..0a7200662db 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java @@ -27,6 +27,7 @@ import edu.harvard.iq.dataverse.search.savedsearch.SavedSearchServiceBean; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.BundleUtil; +import edu.harvard.iq.dataverse.util.DateUtil; import edu.harvard.iq.dataverse.util.FileUtil; import edu.harvard.iq.dataverse.util.SystemConfig; import edu.harvard.iq.dataverse.util.json.JsonParser; @@ -51,6 +52,7 @@ import java.io.InputStream; import java.net.URI; +import java.time.Instant; import java.util.*; import java.util.concurrent.Callable; import java.util.logging.Level; @@ -451,10 +453,17 @@ protected void validateInternalVersionNumberIsNotOutdated(Dataset dataset, int i } } - protected void validateInternalVersionNumberIsNotOutdated(DataFile dataFile, int internalVersion) throws WrappedResponse { - if (dataFile.getFileMetadata().getDatasetVersion().getId() > internalVersion) { + protected void validateInternalTimestampIsNotOutdated(DataFile dataFile, String sourceInternalVersionTimestamp) throws WrappedResponse { + Date date = sourceInternalVersionTimestamp != null ? DateUtil.parseDate(sourceInternalVersionTimestamp, "yyyy-MM-dd'T'HH:mm:ss'Z'") : null; + if (date == null) { throw new WrappedResponse( - badRequest(BundleUtil.getStringFromBundle("abstractApiBean.error.datafileInternalVersionNumberIsOutdated", Collections.singletonList(Integer.toString(internalVersion)))) + badRequest(BundleUtil.getStringFromBundle("jsonparser.error.parsing.date", Collections.singletonList(sourceInternalVersionTimestamp))) + ); + } + Instant instant = date.toInstant(); + if (dataFile.getFileMetadata().getDatasetVersion().getLastUpdateTime().toInstant().getEpochSecond() != instant.getEpochSecond()) { + throw new WrappedResponse( + badRequest(BundleUtil.getStringFromBundle("abstractApiBean.error.datafileInternalVersionTimestampIsOutdated", Collections.singletonList(sourceInternalVersionTimestamp))) ); } } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Files.java b/src/main/java/edu/harvard/iq/dataverse/api/Files.java index 33b380df865..b38d5375f66 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Files.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Files.java @@ -410,7 +410,7 @@ public Response deleteFileInDataset(@Context ContainerRequestContext crc, @PathP @AuthRequired @Path("{id}/metadata") public Response updateFileMetadata(@Context ContainerRequestContext crc, @FormDataParam("jsonData") String jsonData, - @PathParam("id") String fileIdOrPersistentId, @QueryParam("sourceInternalVersionNumber") Integer sourceInternalVersionNumber + @PathParam("id") String fileIdOrPersistentId, @QueryParam("sourceInternalVersionTimestamp") String sourceInternalVersionTimestamp ) throws CommandException { FileMetadata upFmd = null; @@ -429,9 +429,9 @@ public Response updateFileMetadata(@Context ContainerRequestContext crc, @FormDa return error(BAD_REQUEST, "Error attempting get the requested data file."); } - if (sourceInternalVersionNumber != null) { + if (sourceInternalVersionTimestamp != null) { try { - validateInternalVersionNumberIsNotOutdated(df, sourceInternalVersionNumber); + validateInternalTimestampIsNotOutdated(df, sourceInternalVersionTimestamp); } catch (WrappedResponse wr) { return wr.getResponse(); } diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index 0b5803d75d1..cc5bef0f4a3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -873,7 +873,8 @@ public static JsonObjectBuilder json(DataFile df, FileMetadata fileMetadata, boo .add("tabularData", df.isTabularData()) .add("tabularTags", getTabularFileTags(df)) .add("creationDate", df.getCreateDateFormattedYYYYMMDD()) - .add("publicationDate", df.getPublicationDateFormattedYYYYMMDD()); + .add("publicationDate", df.getPublicationDateFormattedYYYYMMDD()) + .add("lastUpdateTime", format(fileMetadata.getDatasetVersion().getLastUpdateTime())); Dataset dfOwner = df.getOwner(); if (dfOwner != null) { builder.add("fileAccessRequest", dfOwner.isFileAccessRequest()); diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index 09ea8d2e378..1036e1a836c 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -3205,4 +3205,4 @@ updateDatasetFieldsCommand.api.processDatasetUpdate.parseError=Error parsing dat #AbstractApiBean.java abstractApiBean.error.datasetInternalVersionNumberIsOutdated=Dataset internal version number {0} is outdated -abstractApiBean.error.datafileInternalVersionNumberIsOutdated=File Metadata internal version number {0} is outdated +abstractApiBean.error.datafileInternalVersionTimestampIsOutdated=File Metadata internal version timestamp {0} is outdated diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java index d8d4cf80535..de45362ce98 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java @@ -5,7 +5,9 @@ import io.restassured.RestAssured; import io.restassured.response.Response; -import java.util.List; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; import java.util.logging.Logger; import edu.harvard.iq.dataverse.api.auth.ApiKeyAuthMechanism; @@ -29,9 +31,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.text.MessageFormat; -import java.util.Arrays; -import java.util.Collections; -import java.util.Map; import jakarta.json.Json; import jakarta.json.JsonObjectBuilder; @@ -3191,7 +3190,7 @@ public void testFileCitationByVersion() throws IOException { } @Test - public void testUpdateWithEmptyFieldsAndVersionCheck() { + public void testUpdateWithEmptyFieldsAndVersionCheck() throws InterruptedException { // Create User, Dataverse, and Dataset Response createUser = UtilIT.createRandomUser(); createUser.then().assertThat().statusCode(OK.getStatusCode()); @@ -3245,7 +3244,7 @@ public void testUpdateWithEmptyFieldsAndVersionCheck() { // Get the base version getFile = UtilIT.getFileData(String.valueOf(fileId), apiToken); getFile.prettyPrint(); - String datasetVersionId = String.valueOf(JsonPath.from(getFile.body().asString()).getInt("data.datasetVersionId")); + String lastUpdateTime = String.valueOf(JsonPath.from(getFile.body().asString()).getString("data.dataFile.lastUpdateTime")); // first user updates which creates a new DRAFT version json = Json.createObjectBuilder() @@ -3255,9 +3254,10 @@ public void testUpdateWithEmptyFieldsAndVersionCheck() { .add(OptionalFileParams.PROVENANCE_FREEFORM_ATTR_NAME, "") .add(OptionalFileParams.CATEGORIES_ATTR_NAME, Json.createArrayBuilder()) .add(OptionalFileParams.FILE_DATA_TAGS_ATTR_NAME, Json.createArrayBuilder()); - Response updateResponse = UtilIT.updateFileMetadata(String.valueOf(fileId), json.build().toString(), apiToken); + Response updateResponse = UtilIT.updateFileMetadata(String.valueOf(fileId), json.build().toString(), apiToken, lastUpdateTime); updateResponse.prettyPrint(); updateResponse.then().assertThat().statusCode(OK.getStatusCode()); + Thread.sleep(1500); // Get the latest version getFile = UtilIT.getFileData(String.valueOf(fileId), apiToken); @@ -3270,15 +3270,17 @@ public void testUpdateWithEmptyFieldsAndVersionCheck() { .body("data.provFreeForm", nullValue()) .body("data.categories", nullValue()) .body("data.dataFile.tabularTags", nullValue()); + String latestUpdateTime = String.valueOf(JsonPath.from(getFile.body().asString()).getString("data.dataFile.lastUpdateTime")); + assertTrue(!latestUpdateTime.equalsIgnoreCase(lastUpdateTime)); // Second user updates the base version which should fail since it's already been updated json = Json.createObjectBuilder() .add(OptionalFileParams.DESCRIPTION_ATTR_NAME, "my new description"); - updateResponse = UtilIT.updateFileMetadata(String.valueOf(fileId), json.build().toString(), apiToken, datasetVersionId); + updateResponse = UtilIT.updateFileMetadata(String.valueOf(fileId), json.build().toString(), apiToken, lastUpdateTime); updateResponse.prettyPrint(); updateResponse.then().assertThat() .body("status", equalTo(ApiConstants.STATUS_ERROR)) - .body("message", equalTo(BundleUtil.getStringFromBundle("abstractApiBean.error.datafileInternalVersionNumberIsOutdated",Collections.singletonList(datasetVersionId)))) + .body("message", equalTo(BundleUtil.getStringFromBundle("abstractApiBean.error.datafileInternalVersionTimestampIsOutdated",Collections.singletonList(lastUpdateTime)))) .statusCode(BAD_REQUEST.getStatusCode()); // Second user refreshes and updates. Should pass now @@ -3286,10 +3288,18 @@ public void testUpdateWithEmptyFieldsAndVersionCheck() { getFile.prettyPrint(); getFile.then().assertThat() .statusCode(OK.getStatusCode()); - datasetVersionId = String.valueOf(JsonPath.from(getFile.body().asString()).getInt("data.datasetVersionId")); - updateResponse = UtilIT.updateFileMetadata(String.valueOf(fileId), json.build().toString(), apiToken, datasetVersionId); + lastUpdateTime = String.valueOf(JsonPath.from(getFile.body().asString()).getString("data.dataFile.lastUpdateTime")); + updateResponse = UtilIT.updateFileMetadata(String.valueOf(fileId), json.build().toString(), apiToken, lastUpdateTime); updateResponse.prettyPrint(); updateResponse.then().assertThat() .statusCode(OK.getStatusCode()); + + // Test invalid date + updateResponse = UtilIT.updateFileMetadata(String.valueOf(fileId), json.build().toString(), apiToken, "bad-date"); + updateResponse.prettyPrint(); + updateResponse.then().assertThat() + .body("status", equalTo(ApiConstants.STATUS_ERROR)) + .body("message", equalTo(BundleUtil.getStringFromBundle("jsonparser.error.parsing.date",Collections.singletonList("bad-date")))) + .statusCode(BAD_REQUEST.getStatusCode()); } } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index f9e97022d2e..04d0b27d63c 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -1092,15 +1092,15 @@ static Response deleteFileApi(Integer fileId, String apiToken) { static Response updateFileMetadata(String fileIdOrPersistentId, String jsonAsString, String apiToken) { return updateFileMetadata(fileIdOrPersistentId, jsonAsString,apiToken, null); } - static Response updateFileMetadata(String fileIdOrPersistentId, String jsonAsString, String apiToken, String datasetVersionId) { + static Response updateFileMetadata(String fileIdOrPersistentId, String jsonAsString, String apiToken, String sourceInternalVersionTimestamp) { String idInPath = fileIdOrPersistentId; // Assume it's a number. String optionalQueryParam = ""; // If idOrPersistentId is a number we'll just put it in the path. if (!NumberUtils.isCreatable(fileIdOrPersistentId)) { idInPath = ":persistentId"; optionalQueryParam = "?persistentId=" + fileIdOrPersistentId; } - if (datasetVersionId != null) { - optionalQueryParam = optionalQueryParam + (optionalQueryParam.isEmpty() ? "?" : "&") + "sourceInternalVersionNumber=" + datasetVersionId; + if (sourceInternalVersionTimestamp != null) { + optionalQueryParam = optionalQueryParam + (optionalQueryParam.isEmpty() ? "?" : "&") + "sourceInternalVersionTimestamp=" + sourceInternalVersionTimestamp; } RequestSpecification requestSpecification = given() .header(API_TOKEN_HTTP_HEADER, apiToken); From 6fedf6e887d09b71618124119e8bac597a9deddd Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Fri, 25 Apr 2025 14:26:05 -0400 Subject: [PATCH 015/470] comment on data/timestamp compare --- src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java index 0a7200662db..00dadb1cae4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java @@ -461,6 +461,7 @@ protected void validateInternalTimestampIsNotOutdated(DataFile dataFile, String ); } Instant instant = date.toInstant(); + // granularity is to the second since the json output only returns dates in this format to the second if (dataFile.getFileMetadata().getDatasetVersion().getLastUpdateTime().toInstant().getEpochSecond() != instant.getEpochSecond()) { throw new WrappedResponse( badRequest(BundleUtil.getStringFromBundle("abstractApiBean.error.datafileInternalVersionTimestampIsOutdated", Collections.singletonList(sourceInternalVersionTimestamp))) From c5e65582dae77bf02ad501208c0046d91b4509b2 Mon Sep 17 00:00:00 2001 From: jo-pol Date: Mon, 28 Apr 2025 13:59:03 +0200 Subject: [PATCH 016/470] more informative assert messages, another NPE --- .../iq/dataverse/DatasetFieldServiceBean.java | 29 +++-- .../DatasetFieldServiceBeanDansTest.java | 112 ++++++++++++++++-- .../{abrPeriod.json => abrPeriod-1.json} | 0 .../json/cvoc-dans-value/abrPeriod-2.json | 7 ++ 4 files changed, 124 insertions(+), 24 deletions(-) rename src/test/resources/json/cvoc-dans-value/{abrPeriod.json => abrPeriod-1.json} (100%) create mode 100644 src/test/resources/json/cvoc-dans-value/abrPeriod-2.json diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java index 260cbe36f9e..ac98db818e5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java @@ -698,7 +698,12 @@ private JsonObject filterResponse(JsonObject cvocEntry, JsonObject readObject, S logger.fine("Added #id pattern: " + filterKey + ": " + termUri); job.add(filterKey, termUri); } else if (pattern.contains("{")) { - if (!vals.isEmpty()) { + if (vals.isEmpty()) { + if (nrOfNotFound == 0) { + logger.warning("External Vocabulary: " + termUri + " - No value found for " + filterKey); + } + } + else { if (pattern.equals("{0}")) { if (vals.get(0) instanceof JsonArray) { job.add(filterKey, (JsonArray) vals.get(0)); @@ -716,8 +721,6 @@ else if (vals.get(0) instanceof JsonObject) { job.add(filterKey, result); logger.fine("Added : " + filterKey + ": " + result); } - } else if (nrOfNotFound == 0) { - logger.warning("External Vocabulary: " + termUri + " - No value found for " + filterKey); } } else { logger.fine("Added hardcoded pattern: " + filterKey + ": " + pattern); @@ -755,14 +758,16 @@ Object processPathSegment(int index, String[] pathParts, JsonValue curPath, Stri if (expected.equals("@id")) { expected = termUri; } - for (int k = 0; k < arr.size(); k++) { - JsonObject jo = arr.getJsonObject(k); - if (!jo.isEmpty()) { - JsonValue val = jo.get(keyVal[0]); - if (val != null && val.getValueType() == ValueType.STRING && val.toString().equals(expected)) { - logger.fine("Found: " + jo.toString()); - curPath = jo; - return processPathSegment(index + 1, pathParts, curPath, termUri); + if (arr != null) { + for (int k = 0; k < arr.size(); k++) { + JsonObject jo = arr.getJsonObject(k); + if (!jo.isEmpty()) { + JsonValue val = jo.get(keyVal[0]); + if (val != null && val.getValueType() == ValueType.STRING && val.toString().equals(expected)) { + logger.fine("Found: " + jo.toString()); + curPath = jo; + return processPathSegment(index + 1, pathParts, curPath, termUri); + } } } } @@ -785,7 +790,7 @@ Object processPathSegment(int index, String[] pathParts, JsonValue curPath, Stri } else { curPath = ((JsonObject) curPath).get(pathParts[index]); - logger.fine("Found next Path object " + curPath.toString()); + logger.fine("Found next Path object " + curPath); return processPathSegment(index + 1, pathParts, curPath, termUri); } } else { diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java index ebb290dbf04..ff2cf7921d3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java @@ -14,11 +14,17 @@ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; +import java.io.StringReader; import java.lang.reflect.Method; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.List; +import java.util.logging.ConsoleHandler; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.stream.Collectors; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.assertj.core.api.Assertions.assertThat; public class DatasetFieldServiceBeanDansTest { @@ -32,6 +38,20 @@ static String getCvocJson(String pathToJsonFile) throws IOException { @BeforeEach void setUp() { this.datasetFieldServiceBean = Mockito.spy(new DatasetFieldServiceBean()); + +// Logger rootLogger = Logger.getLogger(DatasetFieldServiceBean.class.getCanonicalName()); +// rootLogger.setLevel(Level.FINE); +// +// // Ensure all handlers respect the FINE level +// for (var handler : rootLogger.getHandlers()) { +// handler.setLevel(Level.FINE); +// } +// +// // Add a ConsoleHandler if none exists +// if (rootLogger.getHandlers().length == 0) { +// ConsoleHandler consoleHandler = new ConsoleHandler(); +// rootLogger.addHandler(consoleHandler); +// } } @AfterEach @@ -39,29 +59,97 @@ void tearDown() { this.datasetFieldServiceBean = null; } + @Test + void interceptedResultForAudience() { // TODO remove when assertTermNameValues succeeds in another test + JsonObject result = Json.createReader(new StringReader(""" + { + "@id": "https://www.narcis.nl/classification/D18100", + "termName": [ + { + "lang": "nl", + "value": "Exploitatie en beheer van het fysieke milieu" + }, + { + "lang": "en", + "value": "Exploitation and management of the physical environment" + } + ], + "vocabularyUri": "https://www.narcis.nl/classification/" + } + """)).readObject(); + List expectedValues = List.of( + "Exploitation and management of the physical environment", + "Exploitatie en beheer van het fysieke milieu" + ); + assertThat(result.getString("@id")).isEqualTo("https://www.narcis.nl/classification/D18100"); + assertTermNameValues(result, expectedValues); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri"); + // TODO shouldn't we also get the vocabularyName? + } + @Test void getIndexableStringsForAudience() throws Exception { - String termURI = "https://www.narcis.nl/classification/D13000"; + String termURI = "https://www.narcis.nl/classification/D18100"; JsonObject cvocEntry = createMocks("dansAudience", termURI, "audience.json"); JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/audience.json"); - String result = reflectFilterResponse().invoke(datasetFieldServiceBean, cvocEntry, readObject, termURI).toString(); + JsonObject result = (JsonObject) reflectFilterResponse().invoke(datasetFieldServiceBean, cvocEntry, readObject, termURI); + + List expectedValues = List.of( + "Exploitation and management of the physical environment", + "Exploitatie en beheer van het fysieke milieu" + ); + assertThat(result.getString("@id")).isEqualTo(termURI); + assertTermNameValues(result, expectedValues); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri"); + } + + @Test + void getIndexableStringsForAbrPeriod1() throws Exception { + String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/19679187-0ac4-4127-b4cd-09a348400585"; + JsonObject cvocEntry = createMocks("dansAbrPeriod", termURI, "abrPeriod.json"); + JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/abrPeriod-1.json"); - assertTrue(result.contains(termURI)); - assertTrue(result.contains("Exploitation and management of the physical environment")); - assertTrue(result.contains("Exploitatie en beheer van het fysieke milieu")); + JsonObject result = (JsonObject) reflectFilterResponse().invoke(datasetFieldServiceBean, cvocEntry, readObject, termURI); + + List expectedValues = List.of( + "Vroege Middeleeuwen D" + ); + assertThat(result.getString("@id")).isEqualTo(termURI); + assertTermNameValues(result, expectedValues); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri"); } @Test - void getIndexableStringsForAbrPeriod() throws Exception { - String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/02aea074-a4a9-4335-9698-bec9a188964e"; + void getIndexableStringsForAbrPeriod2() throws Exception { + String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/19679187-0ac4-4127-b4cd-09a348400585"; JsonObject cvocEntry = createMocks("dansAbrPeriod", termURI, "abrPeriod.json"); - JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/abrPeriod.json"); + JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/abrPeriod-2.json"); + + JsonObject result = (JsonObject) reflectFilterResponse().invoke(datasetFieldServiceBean, cvocEntry, readObject, termURI); - String result = reflectFilterResponse().invoke(datasetFieldServiceBean, cvocEntry, readObject, termURI).toString(); + List expectedValues = List.of( + "Eerste Wereldoorlog" + ); + assertThat(result.getString("@id")).isEqualTo(termURI); + assertTermNameValues(result, expectedValues); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri"); + } + + private void assertTermNameValues(JsonObject result, List expectedValues) { + assertThat(termNameValues(result)) + .withFailMessage("Expected result with termName values: %s but got: %s", expectedValues, result) + .containsExactlyInAnyOrderElementsOf(expectedValues); + } - assertTrue(result.contains(termURI)); - assertTrue(result.contains("Vroege Middeleeuwen D")); + private @NotNull List termNameValues(JsonObject result) { + var termName = result.getJsonArray("termName"); + if (termName == null) { + return List.of(); + } + return termName.stream() + .map(jsonValue -> ((JsonObject) jsonValue).getString("value")) + .collect(Collectors.toList()); } private JsonObject readObject(String pathname) throws FileNotFoundException { diff --git a/src/test/resources/json/cvoc-dans-value/abrPeriod.json b/src/test/resources/json/cvoc-dans-value/abrPeriod-1.json similarity index 100% rename from src/test/resources/json/cvoc-dans-value/abrPeriod.json rename to src/test/resources/json/cvoc-dans-value/abrPeriod-1.json diff --git a/src/test/resources/json/cvoc-dans-value/abrPeriod-2.json b/src/test/resources/json/cvoc-dans-value/abrPeriod-2.json new file mode 100644 index 00000000000..0f9536a914e --- /dev/null +++ b/src/test/resources/json/cvoc-dans-value/abrPeriod-2.json @@ -0,0 +1,7 @@ +{ + "@id": "https://data.cultureelerfgoed.nl/term/id/abr/19679187-0ac4-4127-b4cd-09a348400585", + "termName": { + "lang": "nl", + "value": "Eerste Wereldoorlog" + } +} \ No newline at end of file From a731d86185286ba5f8b2e66dddfa339d39a303fc Mon Sep 17 00:00:00 2001 From: jo-pol Date: Mon, 28 Apr 2025 14:39:34 +0200 Subject: [PATCH 017/470] mixed up filterResponse intercepted input and output --- .../json/cvoc-dans-value/abrPeriod-2.json | 2947 ++++++++++++++++- 1 file changed, 2942 insertions(+), 5 deletions(-) diff --git a/src/test/resources/json/cvoc-dans-value/abrPeriod-2.json b/src/test/resources/json/cvoc-dans-value/abrPeriod-2.json index 0f9536a914e..30db15ae569 100644 --- a/src/test/resources/json/cvoc-dans-value/abrPeriod-2.json +++ b/src/test/resources/json/cvoc-dans-value/abrPeriod-2.json @@ -1,7 +1,2944 @@ { - "@id": "https://data.cultureelerfgoed.nl/term/id/abr/19679187-0ac4-4127-b4cd-09a348400585", - "termName": { - "lang": "nl", - "value": "Eerste Wereldoorlog" - } + "@context" : { + "skos" : "http://www.w3.org/2004/02/skos/core#", + "isothes" : "http://purl.org/iso25964/skos-thes#", + "rdfs" : "http://www.w3.org/2000/01/rdf-schema#", + "owl" : "http://www.w3.org/2002/07/owl#", + "dct" : "http://purl.org/dc/terms/", + "dc11" : "http://purl.org/dc/elements/1.1/", + "uri" : "@id", + "type" : "@type", + "lang" : "@language", + "value" : "@value", + "graph" : "@graph", + "label" : "rdfs:label", + "prefLabel" : "skos:prefLabel", + "altLabel" : "skos:altLabel", + "hiddenLabel" : "skos:hiddenLabel", + "broader" : "skos:broader", + "narrower" : "skos:narrower", + "related" : "skos:related", + "inScheme" : "skos:inScheme", + "exactMatch" : "skos:exactMatch", + "closeMatch" : "skos:closeMatch", + "broadMatch" : "skos:broadMatch", + "narrowMatch" : "skos:narrowMatch", + "relatedMatch" : "skos:relatedMatch" + }, + "graph" : [ { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/004f5603-faec-4772-acea-daa4aa24c03b", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed met secundair lood- of tinglazuur" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0113e071-d5f8-477a-99e6-788c5c69a53d", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "fles - bolvormig op voet:kottman fle13" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/013dafbb-285e-4aa9-8ffa-fb97b46b6aea", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "pijp (bouwmateriaal)" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/01628d5b-e55a-48f1-9992-8f107671d728", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "anderhalfhandzwaard" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/04f39851-fb9b-4eba-9f2a-c5dd24c62791", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:beker - Westerwalds" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/05ea0275-6619-4a79-bc1f-f97741e2a89d", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "witbakkend geglazuurd:beker - Langerwehe witbakkend" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0791023c-74d0-4d7c-9db0-4808cc0d6ff7", + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0982f293-db33-4f70-8132-32e7a76af6da", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:kan - Keuls" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/09f48cf7-57ef-457c-a09f-4b6076fa525b", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "snaphaan" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0a6b9481-6b71-4b8d-89ad-4ba763a0cc07", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "majolica uit de Nederlanden:zalfpot" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0a7d7db7-a8ff-4751-afbc-0c362652e8c6", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "Husum aardewerk" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0c78785a-e2aa-41ec-8e06-f7ca132e3ce4", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "fles - kottman fle1-12/14-32" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0e3f035d-aa91-4799-b7a3-7964e12cbcdf", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "gordelsluiting driedelig" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/103df23a-3fec-4c20-9dc5-9b7b33c7e1f0", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "ruiterhelm" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/10fa72e0-d8f5-4391-92f0-9428a7aa9def", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "roodbakkend geglazuurd:tuitpot" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/1273e5ef-faa8-4c1b-8f5a-773f3e83f962", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "rood- of witbakkend aardewerk uit het Iberisch Schiereiland:pot" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/13380260-8bf0-4846-9361-e94515b4d6b6", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "kledinghaak" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/13d8f79b-9c91-49a1-9c10-beb8385179de", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "gouden rijder" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/14f0abda-e5c8-458b-b985-8e564b595bf4", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "kruithoorn" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/152da0a7-7d3d-493c-8cc7-1c2094b040fd", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "gildepenning" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/1566f1f4-b766-4133-b760-9cc0375db9ed", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "pistool" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/18d1eac7-3e98-423b-b947-760d48475b92", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:voorraadvat" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/1bbcf64b-6c42-4458-a680-07359d19761e", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "schild" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/1c1e666c-817f-49d3-b881-1429acf80964", + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/1f9e6cef-13d9-4011-8cf9-b830e374a245", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "witbakkend geglazuurd:vergiet" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2012cf66-384c-4f9a-ac3b-99edd35ff7cd", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "rolpaard" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/215d59d3-3086-45be-b0c5-f2dc249bb024", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "Italiaans majolica:bord" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/21f08f36-65fa-47e7-b952-4b7e94784053", + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2205f27a-7565-4bea-91df-40ab4d6b83d3", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "majolica uit de Nederlanden:kruik" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/22b49544-4432-4286-81f7-246ade5c5544", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "majolica:kan" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2381f691-11e9-42f4-a81b-43390b727115", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed Siegburg" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/25ea9fe9-c6e2-43c9-b797-06b06cf38784", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "angelot" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/28924089-dbee-4053-9b29-a18ebbb4dd70", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "3 guldenstuk" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2a2b50fe-0ac3-4f40-86c7-21d443a7dda4", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "schelling" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2a347dff-f219-490a-8691-f2c8d8fd1f5b", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "roodbakkend geglazuurd:kom - gemarmerd" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2b14db48-5875-41aa-8a99-579821c24344", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "jager" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2c4ae3a0-bca7-4073-b59d-bf486772209f", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed:kan - Langerwehe" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2d3c54b5-fc4a-4a8f-a8ca-15322cfb5b92", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "hafneraardewerk:zuigfles" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2dc88096-e3db-4690-9456-3538265f4ad8", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "dubloen" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2eb6a4fd-c260-4c99-ab0d-0f7f98fb09c3", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "korte" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2ef593dc-a3c8-4a13-a481-0f61f897fe10", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "rood- of witbakkend aardewerk uit het Iberisch Schiereiland:kruik" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2f2a5230-7a76-493a-a019-87e33f6459fd", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "majolica uit de Nederlanden" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2ff0cd33-221e-4562-9327-79ea111e679d", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "witbakkend geglazuurd:kan - Rijnlands" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3157854b-9675-4fdf-a72e-5099dac51714", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "Engels witbakkend aardewerk" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/31ee8678-c485-4519-9744-60ceb53b2273", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "borstkuras" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/322ac368-452d-4221-97ba-1e39c47b1e31", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:pispot - Raerens" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3287454d-3189-436b-9d97-b2fe9639ba55", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "landsknechtzwaard" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/33221058-d887-463f-80ae-9b2623c833c5", + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/361853e8-55a7-4f1d-8ffd-8576686660d2", + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3679f79a-1a0e-4f70-99c5-1246ce72d87f", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "hafneraardewerk:beker" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/381756bc-68c5-4de5-8550-6213bf50a2b6", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "beenpijp" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/387209a6-65dd-4d23-acc4-6fa48b1ff286", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "majolica:bord - Zuidnederlands" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/38b1e07a-cd17-4431-88a2-c10ce618a84e", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:kom" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/391b53f9-3c69-42f7-a9fa-b9cf0aec9c18", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "witbakkend geglazuurd:bord - Weser" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3b33c878-931e-4805-80f4-77a490e80ad0", + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3ca60c2d-0388-4544-b7b4-5f1062d2ffdf", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "roodbakkend geglazuurd:kom - Werra/Wanfried/Enkhuizer/Hessisch" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3d8cdff2-e7c0-402f-bed2-2f9ecef6aaab", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "slang" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3eb952ef-1e04-4fba-b29b-43a0ffb2b783", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:kan - Siegburgs" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3efaf1ae-dcb7-443c-bcd7-14283bdf74b5", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:kruik - Raerens" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3fe74d96-4ae0-4642-a3f1-d85c23df8341", + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/47cd1d16-de7a-4344-96a2-0d21154087dc", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:beker - Frechen" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6", + "type" : [ "skos:Concept", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "https://data.cultureelerfgoed.nl/id/rnce#PeriodAbr" ], + "altLabel" : { + "lang" : "nl", + "value" : "Nieuwe Tijd A" + }, + "broader" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c6858173-5ca2-4319-b242-f828ec53d52d" + }, + "skos:hiddelLabel" : { + "lang" : "nl", + "value" : "NTV" + }, + "prefLabel" : { + "lang" : "nl", + "value" : "Nieuwe Tijd Vroeg" + }, + "skos:scopeNote" : { + "lang" : "nl", + "value" : "Periode tussen 1500 en 1650 waarin Nederland als politiek-bestuurlijke entiteit deels vorm krijgt als Republiek der Zeven Verenigde Nederlanden (1579). Het einde wordt gemarkeerd door de Vrede van Munster (1648). Deze periode wordt gekenmerkt door militair conflict, de reformatie, renaissance, ontstaan van de wereldhandel, economische voorspoed en specialisatie en een explosieve groei van steden in Holland en Zeeland (vooral Amsterdam)." + }, + "https://data.cultureelerfgoed.nl/id/rnce#beginYearAbr" : 1500, + "https://data.cultureelerfgoed.nl/id/rnce#codeAbr" : { + "lang" : "nl", + "value" : "NTV" + }, + "https://data.cultureelerfgoed.nl/id/rnce#endYearAbr" : 1649, + "https://data.cultureelerfgoed.nl/id/rnce#isBeginPeriodAbrOf" : [ { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e91f2545-74e1-4078-8631-178f600d4d06" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e5c5e22d-eac4-4b37-a9e1-e493c1e33cc9" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/09f48cf7-57ef-457c-a09f-4b6076fa525b" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/bed37866-17c8-49d8-89f1-d7b1ba045341" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f7fe1780-a3ca-44e3-a5dd-48d4e2d735da" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d60b61ba-aaef-407f-be19-14535f4e20f6" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c75468d6-7937-41d3-aaa8-89e12b4565fe" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/793ab729-5d11-4794-99e3-6114458cbb50" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2a347dff-f219-490a-8691-f2c8d8fd1f5b" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/cf2dcb18-ef04-4e2b-88d3-73a3d77d4253" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3ca60c2d-0388-4544-b7b4-5f1062d2ffdf" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8708f8a7-0b1d-418d-ba4b-5bca2254bd10" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c8ff7016-7484-425a-9c0a-af02c5700346" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8add3bf4-b408-4dbd-ac95-7a1570b0c99e" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6d64575b-13b9-4b39-aaf1-3c31da837ed0" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d6b7aea7-7af4-4ed7-a048-20b07201985b" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b2b23c7b-fabd-4996-a5c7-2c60842a71cb" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/47cd1d16-de7a-4344-96a2-0d21154087dc" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a6bbe3bb-838c-4f46-a0c6-2b935dc0df87" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b4315238-a53e-40a5-aa04-66278b102798" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f93c27fd-d5f6-486c-9a85-900cd9d81b51" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b3790c6d-cee2-4e6c-baf4-40fd4166c77b" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/391b53f9-3c69-42f7-a9fa-b9cf0aec9c18" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8c35015e-0861-4f8d-a341-c4f44f5de3f7" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/585b3359-ddf2-44e7-9568-6aa232b29834" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/99c19a14-47a8-4143-9581-d5a4344c2b02" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f6115f61-a3b9-4964-847f-6712b8b96c3c" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/584c39ac-11c6-44d4-bc5f-36c5abbeea99" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9304db0a-73c1-43e1-af04-a95fc538fae4" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a68f9ac0-cc2a-4574-a116-c611f6f06b79" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e8cd7206-b5c7-41d3-ad3d-93f262829ae3" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5aa462d5-3ac9-4db1-a36d-a64471f96dbb" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/55d7b468-303c-4874-a0d9-036f7720d7b6" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2ff0cd33-221e-4562-9327-79ea111e679d" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/797b6c65-e8e0-434d-be9c-9c1be6b64ca5" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0982f293-db33-4f70-8132-32e7a76af6da" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a5b85eb3-1774-4382-a3b5-24166f963a77" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3eb952ef-1e04-4fba-b29b-43a0ffb2b783" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7219f188-3fa7-450b-9e8e-70db72916475" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7fc9a3a6-3de8-4adc-9672-d69aee99c942" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/54f59147-a7ef-4e9d-92dc-52a306392887" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e71fd74c-95d4-4aeb-9810-e6e96c5abb20" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/152da0a7-7d3d-493c-8cc7-1c2094b040fd" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/61e4c4b4-3ae2-4ac9-b915-4cd527fd8367" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/4ede7c26-abdb-4aae-834b-410a7dce5582" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d80b7b40-46ad-412d-83c0-12794fe2e687" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/64f095f5-94ee-40b3-ad44-1b26a0bbf67d" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/14f0abda-e5c8-458b-b985-8e564b595bf4" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f558a608-fc4b-4632-ab1d-67c8e59b70d0" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e0a42c1f-cce6-42a7-8235-aa835246ab8a" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/cdcf7ca0-2a2f-4977-b766-2db4ac707e49" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fb14e43f-7f9d-4047-8617-2e34c96fdc96" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b0f413b5-7cb1-410b-8d96-69685f251273" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/04f39851-fb9b-4eba-9f2a-c5dd24c62791" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f75b7ee2-20e6-4705-9793-6309974d4592" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/387209a6-65dd-4d23-acc4-6fa48b1ff286" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ac07ea63-143f-4e32-9b05-44ea4c539eb8" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3efaf1ae-dcb7-443c-bcd7-14283bdf74b5" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8beb812f-3ec2-494f-9f5a-27f2cb7534d3" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/59dff97e-afd1-4190-a571-e575cb8e6b34" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/322ac368-452d-4221-97ba-1e39c47b1e31" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/4fd383d7-0740-4aef-8d73-be36590832a2" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/bbbd88ed-815e-47b1-9d07-64a27e6d9c64" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7dfd2aae-688c-44f6-9187-214ead9322e5" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9e13425d-cf94-4b4c-8752-302596c9061f" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e526f544-3a01-4b5c-a3e4-ee8bd5307442" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9727fd31-90c7-40e7-a673-39d481f5e7b8" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6b66f4d2-3c58-44b9-818f-2a94b91528d8" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/da7626e0-13c3-4ef7-ba3c-a30da67492c5" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9ac57e3d-697f-4331-942f-2daa66596c22" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a55c4e4e-4e3c-4da0-acaa-07bc45dfe147" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/72adce71-110f-40c0-9cff-ead9dfba636f" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2dc88096-e3db-4690-9456-3538265f4ad8" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d98a6cb4-19f1-4720-8476-dfb29e039536" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a116858a-f4e7-4a21-9a01-c835306702ba" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/28924089-dbee-4053-9b29-a18ebbb4dd70" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/1566f1f4-b766-4133-b760-9cc0375db9ed" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2012cf66-384c-4f9a-ac3b-99edd35ff7cd" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f010757f-3707-47ec-bbca-311aac3e97ae" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c64ae6af-abdf-4376-8092-a68337b9f571" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fdef7a76-b003-47ca-82a4-2b513e03790e" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0c78785a-e2aa-41ec-8e06-f7ca132e3ce4" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/907cc275-8b04-44f8-ac8a-29fad197fc42" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7227c115-166c-442f-be14-c5c7c99cc1cd" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8d613113-dce7-4eea-b35a-7b10b841d524" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/18d1eac7-3e98-423b-b947-760d48475b92" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/10fa72e0-d8f5-4391-92f0-9428a7aa9def" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/1f9e6cef-13d9-4011-8cf9-b830e374a245" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/62909c16-d305-4b89-9753-c278d01eca3e" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f9a94eba-cb48-4886-996f-6800016a4146" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3d8cdff2-e7c0-402f-bed2-2f9ecef6aaab" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9ca1d5b2-5e61-403b-902b-eced0b4f1b63" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ab5d6a35-94eb-40a8-bea1-418273bf06ed" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e27f9d00-d79a-4a51-a459-5ce37b4ee721" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/013dafbb-285e-4aa9-8ffa-fb97b46b6aea" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5c6add3c-f39c-4fb2-8957-87d7bba6a6da" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7d50dce3-abe2-4e62-9b17-4c82658891b9" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ba06f5f1-6480-4119-9ad0-2162c8e6a1f9" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2a2b50fe-0ac3-4f40-86c7-21d443a7dda4" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/491c1df4-1cd7-4dad-8915-78f1a5eb619f" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ddf5517c-2026-4e38-8e2f-d30524068fce" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/84cb2e0c-58f9-4e38-ad95-73bc5cc07175" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6412fa9c-9840-46c8-ab73-86b021307e32" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/13d8f79b-9c91-49a1-9c10-beb8385179de" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f98ecbbb-d90a-4dc5-ba1f-cf8a16808019" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8ea89171-a104-40ab-abab-9a9471d10128" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/764d25fa-5287-421c-bdbf-7a5feb052d0a" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/619624e1-8792-41d0-867d-634ab89a5e15" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2205f27a-7565-4bea-91df-40ab4d6b83d3" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0a6b9481-6b71-4b8d-89ad-4ba763a0cc07" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9c2398fd-891f-405e-9f2a-12955a2ca888" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2f2a5230-7a76-493a-a019-87e33f6459fd" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6bacf1ec-1217-4cc8-92ca-77f938bd7e51" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/38b1e07a-cd17-4431-88a2-c10ce618a84e" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6c3d30c8-760b-478e-9141-abcdf260f211" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/68dc9ec5-68cb-43d1-9d5e-c6ac9e14c8e6" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5fd26266-df1d-4dbf-b8f2-49a58523a032" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ccbfad71-730c-4df3-b830-be5757eb8d69" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a1d70518-21aa-409d-906f-dcee5da1e126" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3679f79a-1a0e-4f70-99c5-1246ce72d87f" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/84e72199-94fa-447f-b100-59d96a64744e" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b2d3ad6e-f522-4433-9d8a-e1dd85c661ed" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e37b6b91-bcbd-4f38-b2e6-f90783ec0566" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/eb116fc9-b02d-4479-aa9f-e91f927ed2dd" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/74722c90-928f-4eb1-ba7e-929e2368e012" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5d639d90-e1d8-491a-bb16-d196b45fc34c" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/924d0bcc-e4ad-4d31-8ac6-8e9a68ed276e" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/cd883dc5-7505-45ee-b7f9-8121f336966c" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3157854b-9675-4fdf-a72e-5099dac51714" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b0c25500-2d51-4b9e-8959-0c413c31bd1a" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2ef593dc-a3c8-4a13-a481-0f61f897fe10" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/1273e5ef-faa8-4c1b-8f5a-773f3e83f962" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c52310e1-7ee2-439b-85b9-56f97d901968" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/76a5ac62-4cd1-461d-b1b1-d5bc833ee091" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0a7d7db7-a8ff-4751-afbc-0c362652e8c6" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/da424f12-aa83-4549-b83e-6faf9ac15bce" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c742516b-2a85-4abb-80c9-ea5661ed20a5" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b69eab67-921c-4911-9306-c0a24960779e" + } ], + "https://data.cultureelerfgoed.nl/id/rnce#isEndPeriodAbrOf" : [ { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e91f2545-74e1-4078-8631-178f600d4d06" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e5c5e22d-eac4-4b37-a9e1-e493c1e33cc9" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/09f48cf7-57ef-457c-a09f-4b6076fa525b" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/bed37866-17c8-49d8-89f1-d7b1ba045341" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f7fe1780-a3ca-44e3-a5dd-48d4e2d735da" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d60b61ba-aaef-407f-be19-14535f4e20f6" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c75468d6-7937-41d3-aaa8-89e12b4565fe" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/793ab729-5d11-4794-99e3-6114458cbb50" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2a347dff-f219-490a-8691-f2c8d8fd1f5b" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/cf2dcb18-ef04-4e2b-88d3-73a3d77d4253" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3ca60c2d-0388-4544-b7b4-5f1062d2ffdf" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8708f8a7-0b1d-418d-ba4b-5bca2254bd10" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c8ff7016-7484-425a-9c0a-af02c5700346" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8add3bf4-b408-4dbd-ac95-7a1570b0c99e" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6d64575b-13b9-4b39-aaf1-3c31da837ed0" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d6b7aea7-7af4-4ed7-a048-20b07201985b" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b2b23c7b-fabd-4996-a5c7-2c60842a71cb" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/47cd1d16-de7a-4344-96a2-0d21154087dc" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a6bbe3bb-838c-4f46-a0c6-2b935dc0df87" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b4315238-a53e-40a5-aa04-66278b102798" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f93c27fd-d5f6-486c-9a85-900cd9d81b51" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b3790c6d-cee2-4e6c-baf4-40fd4166c77b" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/391b53f9-3c69-42f7-a9fa-b9cf0aec9c18" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8c35015e-0861-4f8d-a341-c4f44f5de3f7" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/585b3359-ddf2-44e7-9568-6aa232b29834" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/99c19a14-47a8-4143-9581-d5a4344c2b02" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f6115f61-a3b9-4964-847f-6712b8b96c3c" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/584c39ac-11c6-44d4-bc5f-36c5abbeea99" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9304db0a-73c1-43e1-af04-a95fc538fae4" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a68f9ac0-cc2a-4574-a116-c611f6f06b79" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e8cd7206-b5c7-41d3-ad3d-93f262829ae3" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5aa462d5-3ac9-4db1-a36d-a64471f96dbb" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/55d7b468-303c-4874-a0d9-036f7720d7b6" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2ff0cd33-221e-4562-9327-79ea111e679d" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/797b6c65-e8e0-434d-be9c-9c1be6b64ca5" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0982f293-db33-4f70-8132-32e7a76af6da" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a5b85eb3-1774-4382-a3b5-24166f963a77" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3eb952ef-1e04-4fba-b29b-43a0ffb2b783" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7219f188-3fa7-450b-9e8e-70db72916475" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7fc9a3a6-3de8-4adc-9672-d69aee99c942" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/54f59147-a7ef-4e9d-92dc-52a306392887" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a55c4e4e-4e3c-4da0-acaa-07bc45dfe147" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/72adce71-110f-40c0-9cff-ead9dfba636f" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/573c416b-c9ce-430a-9944-4a4f12c5753e" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e33deb26-b2d1-4da6-aaaa-1c66fc158a4a" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ff54886c-f8ce-458b-813f-bbccbdf214d8" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fe90b617-55cb-4798-9a24-971ea5f488c9" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2eb6a4fd-c260-4c99-ab0d-0f7f98fb09c3" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2b14db48-5875-41aa-8a99-579821c24344" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6e749426-f0f4-42bc-b8c7-6ebffad97c64" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5cd02de2-76da-401a-ab22-adfe9e42511f" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7e6200ec-e31f-4594-bdf0-65b3f5b5c981" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/25ea9fe9-c6e2-43c9-b797-06b06cf38784" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/13380260-8bf0-4846-9361-e94515b4d6b6" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5c6c4967-1a4e-45aa-ad46-c770803ae0f6" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ccc17770-e195-4028-808f-1dfb0cd9c8c0" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d4a79e6c-b2f7-4a72-83f0-8074fc2250df" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c11c65bb-8df2-403f-b552-9c661a87b2f1" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/01628d5b-e55a-48f1-9992-8f107671d728" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3287454d-3189-436b-9d97-b2fe9639ba55" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/759f3936-b94d-47bb-847f-2a325a0ce0e4" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/31ee8678-c485-4519-9744-60ceb53b2273" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/381756bc-68c5-4de5-8550-6213bf50a2b6" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8a76c93b-62fa-4418-8460-d005a1b9b9f2" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0113e071-d5f8-477a-99e6-788c5c69a53d" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5cebec5e-8a4a-44ad-9d62-5a1df4988ff8" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/dd3b313e-f640-4f52-afcd-93a63157c61d" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7f5bd9ac-9e23-4cfc-9b97-1114a0b8afcf" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fe79c87d-696d-4fc5-a028-85fa910b91d8" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/05ea0275-6619-4a79-bc1f-f97741e2a89d" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f9b0710a-af3c-4b95-bcb6-e255e2421249" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e2c0a298-fdd6-4494-95f8-937a82b0eb7c" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c8fab5ab-ecd1-4436-86a0-d0f0d8c210ed" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6350286f-e186-4811-b753-3d5eda0970d1" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/819dbe92-1392-4872-aa84-7706e1c7b5cc" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f4d851ac-44f1-4a39-ab52-d0dcfb157c10" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6aab7f0c-e795-4fd8-b7b9-289bc844ad65" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2c4ae3a0-bca7-4073-b59d-bf486772209f" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/50cafd45-5e2e-422e-b8cb-fa045028defe" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/745968db-e7be-4631-b143-c92e517d54c6" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/22b49544-4432-4286-81f7-246ade5c5544" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ab413d2f-b562-4446-8fe4-4e17ad5fe1ea" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a7b726b5-2cb6-456d-9d30-eaea452a1af6" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b94bd49e-b7da-4584-b5bf-84e808c15f13" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0e3f035d-aa91-4799-b7a3-7964e12cbcdf" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a96512e5-1927-43c4-b9a8-1596633512ab" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a2491e0b-d340-4f5b-a2cb-7360251065c6" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/724bc219-1321-486c-864a-90b928fad30d" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f07317c7-a4a6-4519-a29b-affdcb70a654" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8926b374-3b17-412d-943b-702c0803ea19" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/491c1df4-1cd7-4dad-8915-78f1a5eb619f" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ddf5517c-2026-4e38-8e2f-d30524068fce" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/84cb2e0c-58f9-4e38-ad95-73bc5cc07175" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f98ecbbb-d90a-4dc5-ba1f-cf8a16808019" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9f5c62ab-8820-48b2-98a4-2d7c8689cf24" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5a5f9b0a-4836-4d48-b1d1-5c08510818e3" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/4d3e1fc1-0b06-4034-b7b7-444255dce331" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/103df23a-3fec-4c20-9dc5-9b7b33c7e1f0" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/720160c2-1f9f-498e-87c1-a6f4f0eaba95" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/acdb07bf-fa05-4608-b263-3585e80eee1e" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fbf3e853-f9f7-4329-bad2-0da6a2c9291a" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/4bb2bac9-fcc9-4fa0-b593-750ebefac4bd" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/1bbcf64b-6c42-4458-a680-07359d19761e" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fddb751a-f3a8-4201-962b-b407cdcc02e2" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a5fe02c8-a620-4bf2-89e4-d819ece35729" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/91503be5-d1d1-4af9-8f90-304b5778edfe" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d05f1bf8-2d4b-416f-ab40-8e45549351cd" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/215d59d3-3086-45be-b0c5-f2dc249bb024" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/764d25fa-5287-421c-bdbf-7a5feb052d0a" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/88d5717a-ac49-43fa-8aa6-b77aa8508218" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2381f691-11e9-42f4-a81b-43390b727115" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2205f27a-7565-4bea-91df-40ab4d6b83d3" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5fd26266-df1d-4dbf-b8f2-49a58523a032" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/690f5913-5acd-4357-939f-2b852d878b9d" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2d3c54b5-fc4a-4a8f-a8ca-15322cfb5b92" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3679f79a-1a0e-4f70-99c5-1246ce72d87f" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/84e72199-94fa-447f-b100-59d96a64744e" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b2d3ad6e-f522-4433-9d8a-e1dd85c661ed" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/004f5603-faec-4772-acea-daa4aa24c03b" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/da424f12-aa83-4549-b83e-6faf9ac15bce" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b5e9d12c-b24a-47d8-981b-1a620ba10b2c" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c8909290-95c2-4cbe-b202-ca66dc0573a2" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e37b6b91-bcbd-4f38-b2e6-f90783ec0566" + } ], + "https://data.cultureelerfgoed.nl/id/rnce#sortPeriod" : "cba" + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/491c1df4-1cd7-4dad-8915-78f1a5eb619f", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "souverein" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/4bb2bac9-fcc9-4fa0-b593-750ebefac4bd", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "schede (dolk, zwaard of mes) - puntbeschermer" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/4d3e1fc1-0b06-4034-b7b7-444255dce331", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "nekschild" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/4ede7c26-abdb-4aae-834b-410a7dce5582", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "musket" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/4fd383d7-0740-4aef-8d73-be36590832a2", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:kan - Raerens" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/50cafd45-5e2e-422e-b8cb-fa045028defe", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed:kan - Middenlimburgs:paars oppervl/roze baksel" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/54f59147-a7ef-4e9d-92dc-52a306392887", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "witbakkend geglazuurd:vuurtest - Saintonge" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/55d7b468-303c-4874-a0d9-036f7720d7b6", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "witbakkend (geglazuurd):pot, bolvormig - Weser" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/573c416b-c9ce-430a-9944-4a4f12c5753e", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "armpijp" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/584c39ac-11c6-44d4-bc5f-36c5abbeea99", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "witbakkend geglazuurd:kruik - Weser" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/585b3359-ddf2-44e7-9568-6aa232b29834", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:kruik - Frechen" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/59dff97e-afd1-4190-a571-e575cb8e6b34", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:tuitpot" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5a5f9b0a-4836-4d48-b1d1-5c08510818e3", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "nobel" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5aa462d5-3ac9-4db1-a36d-a64471f96dbb", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "drinkuit" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5c6add3c-f39c-4fb2-8957-87d7bba6a6da", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "prikker" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5c6c4967-1a4e-45aa-ad46-c770803ae0f6", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "wambuis" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5cd02de2-76da-401a-ab22-adfe9e42511f", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "vlieger" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5cebec5e-8a4a-44ad-9d62-5a1df4988ff8", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "witbakkend geglazuurd:zuigfles - Langerwehe witbakkend" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5d639d90-e1d8-491a-bb16-d196b45fc34c", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "witbakkend aardewerk:kruik" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5fd26266-df1d-4dbf-b8f2-49a58523a032", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed Raeren" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/619624e1-8792-41d0-867d-634ab89a5e15", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "faience uit de Nederlanden:zalfpot" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/61e4c4b4-3ae2-4ac9-b915-4cd527fd8367", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "bandelier" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/62909c16-d305-4b89-9753-c278d01eca3e", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "boegbeeld" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6350286f-e186-4811-b753-3d5eda0970d1", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "maigelein" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6412fa9c-9840-46c8-ab73-86b021307e32", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "duit" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/64f095f5-94ee-40b3-ad44-1b26a0bbf67d", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "musketflint" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/68dc9ec5-68cb-43d1-9d5e-c6ac9e14c8e6", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed Westerwald" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/690f5913-5acd-4357-939f-2b852d878b9d", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "roodbakkend aardewerk:vetvanger" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6aab7f0c-e795-4fd8-b7b9-289bc844ad65", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:kan - Akens" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6b66f4d2-3c58-44b9-818f-2a94b91528d8", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:zalfpot - Raerens" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6bacf1ec-1217-4cc8-92ca-77f938bd7e51", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "faience" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6c3d30c8-760b-478e-9141-abcdf260f211", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:zalfpot" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6d64575b-13b9-4b39-aaf1-3c31da837ed0", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "witbakkend geglazuurd:beker - Rijnlands" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6e749426-f0f4-42bc-b8c7-6ebffad97c64", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "stoter" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/720160c2-1f9f-498e-87c1-a6f4f0eaba95", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "plavuis, ongeglazuurd" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7219f188-3fa7-450b-9e8e-70db72916475", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "roodbakkend geglazuurd:kan - gemarmerd" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7227c115-166c-442f-be14-c5c7c99cc1cd", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "bord - teljoor" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/724bc219-1321-486c-864a-90b928fad30d", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "nistegel" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/72adce71-110f-40c0-9cff-ead9dfba636f", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "ducaton" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7314382d-08ac-4274-b577-3b45982f3cc6", + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/745968db-e7be-4631-b143-c92e517d54c6", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed:kan" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/74722c90-928f-4eb1-ba7e-929e2368e012", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "witbakkend aardewerk:bord" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/759f3936-b94d-47bb-847f-2a325a0ce0e4", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "kruisboogpunt" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/764d25fa-5287-421c-bdbf-7a5feb052d0a", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "Italiaans majolica:kruik" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/76a5ac62-4cd1-461d-b1b1-d5bc833ee091", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "roodbakkend aardewerk uit Azië" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/793ab729-5d11-4794-99e3-6114458cbb50", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "witbakkend geglazuurd:deksel - Weser" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/797b6c65-e8e0-434d-be9c-9c1be6b64ca5", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:kan - Westerwalds" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7d50dce3-abe2-4e62-9b17-4c82658891b9", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "pruik" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7dfd2aae-688c-44f6-9187-214ead9322e5", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "kolfslof" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7e6200ec-e31f-4594-bdf0-65b3f5b5c981", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "scild" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7f5bd9ac-9e23-4cfc-9b97-1114a0b8afcf", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed:grape - Langerwehe" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7fc9a3a6-3de8-4adc-9672-d69aee99c942", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "galjoen" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/819dbe92-1392-4872-aa84-7706e1c7b5cc", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "roodbakkend geglazuurd:bord - sgrafitto" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/84cb2e0c-58f9-4e38-ad95-73bc5cc07175", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "reaal" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/84e72199-94fa-447f-b100-59d96a64744e", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "hafneraardewerk:kruik" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8708f8a7-0b1d-418d-ba4b-5bca2254bd10", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "witbakkend geglazuurd:kom - Weser" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/88d5717a-ac49-43fa-8aa6-b77aa8508218", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed:grape" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8926b374-3b17-412d-943b-702c0803ea19", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "plavuis, geglazuurd" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8a76c93b-62fa-4418-8460-d005a1b9b9f2", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "vuurstolp - roodbakkend geglazuurd halfronde vorm" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8add3bf4-b408-4dbd-ac95-7a1570b0c99e", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "berkemeier" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8beb812f-3ec2-494f-9f5a-27f2cb7534d3", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "Loire:kruik" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8c35015e-0861-4f8d-a341-c4f44f5de3f7", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:kruik - Siegburgs" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8d613113-dce7-4eea-b35a-7b10b841d524", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "kelkglas" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8ea89171-a104-40ab-abab-9a9471d10128", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "dukaat" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/907cc275-8b04-44f8-ac8a-29fad197fc42", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "roodbakkend geglazuurd:teil - slibversierd" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/91503be5-d1d1-4af9-8f90-304b5778edfe", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "Frans majolica:zalfpot" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/924d0bcc-e4ad-4d31-8ac6-8e9a68ed276e", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "dieburgaardewerk" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9304db0a-73c1-43e1-af04-a95fc538fae4", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "majolica:kruik - Zuidnederlands" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9727fd31-90c7-40e7-a673-39d481f5e7b8", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "wandtegel:majolica" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/99c19a14-47a8-4143-9581-d5a4344c2b02", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:kruik - Keuls" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9ac57e3d-697f-4331-942f-2daa66596c22", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "majolica:zalfpot - Zuidnederlands" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9c2398fd-891f-405e-9f2a-12955a2ca888", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "faience uit de Nederlanden" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9c6647c9-321e-47ab-9158-5c6fc47c9238", + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9ca1d5b2-5e61-403b-902b-eced0b4f1b63", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "pompleer" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9e13425d-cf94-4b4c-8752-302596c9061f", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "wandtegel:majolica, Noordnederlands" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9f5c62ab-8820-48b2-98a4-2d7c8689cf24", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "groot" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a116858a-f4e7-4a21-9a01-c835306702ba", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "cent" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a1d70518-21aa-409d-906f-dcee5da1e126", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "roodbakkend Nederrijns aardewerk" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a2491e0b-d340-4f5b-a2cb-7360251065c6", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "baksteen - baksteen:volume ca. 1500-1000 cm3" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a55c4e4e-4e3c-4da0-acaa-07bc45dfe147", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "patagon" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a5b85eb3-1774-4382-a3b5-24166f963a77", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:kan - Frechen" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a5fe02c8-a620-4bf2-89e4-d819ece35729", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "pijlkoker" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a68f9ac0-cc2a-4574-a116-c611f6f06b79", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "majolica:kruik - Noordnederlands" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a6bbe3bb-838c-4f46-a0c6-2b935dc0df87", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:beker - Siegburgs" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a7b726b5-2cb6-456d-9d30-eaea452a1af6", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "karveel" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a96512e5-1927-43c4-b9a8-1596633512ab", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "gesp - rechthoek" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ab0bcb0a-8345-491f-8c1e-f35ce8dcae41", + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ab413d2f-b562-4446-8fe4-4e17ad5fe1ea", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "hulk" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ab5d6a35-94eb-40a8-bea1-418273bf06ed", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "pen" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ac07ea63-143f-4e32-9b05-44ea4c539eb8", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "majolica:bord - Noordnederlands" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/acdb07bf-fa05-4608-b263-3585e80eee1e", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "kienspaanhouder" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b0c25500-2d51-4b9e-8959-0c413c31bd1a", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "faiencebiscuit" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b0f413b5-7cb1-410b-8d96-69685f251273", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:beker - Raerens" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b12050c3-afd4-490a-82fc-bff5d26f92a3", + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b2b23c7b-fabd-4996-a5c7-2c60842a71cb", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:beker - Duingen" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b2d3ad6e-f522-4433-9d8a-e1dd85c661ed", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "hafneraardewerk:kan" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b3790c6d-cee2-4e6c-baf4-40fd4166c77b", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "witbakkend geglazuurd:bord - Saintonge" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b3b4055c-d9d8-41e0-a125-26f6757c9145", + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b4315238-a53e-40a5-aa04-66278b102798", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "roodbakkend geglazuurd:bord - Werra/Wanfried/Enkhuizer/Hessisch" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b5e9d12c-b24a-47d8-981b-1a620ba10b2c", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "witbakkend aardewerk:pot" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b69eab67-921c-4911-9306-c0a24960779e", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "mediterraans slibaardewerk" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b91e387b-dc11-4e2a-85a5-c3ac15aed161", + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b94bd49e-b7da-4584-b5bf-84e808c15f13", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "gordelketting" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ba06f5f1-6480-4119-9ad0-2162c8e6a1f9", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "daalder" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/bbbd88ed-815e-47b1-9d07-64a27e6d9c64", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "waterschip" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/bd652aac-4bf7-4b20-bfd8-8c1859725552", + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/bd9892e0-c000-48b0-8eff-1b14dfb5ff08", + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/bed37866-17c8-49d8-89f1-d7b1ba045341", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "Langrok" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c11c65bb-8df2-403f-b552-9c661a87b2f1", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "kruisboog" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c52310e1-7ee2-439b-85b9-56f97d901968", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "rood- of witbakkend aardewerk uit het Iberisch Schiereiland:amfoor" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c64ae6af-abdf-4376-8092-a68337b9f571", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "pantoffel" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c6858173-5ca2-4319-b242-f828ec53d52d", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#PeriodAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "narrower" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "prefLabel" : { + "lang" : "nl", + "value" : "Nieuwe Tijd" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c742516b-2a85-4abb-80c9-ea5661ed20a5", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "jydepotaardewerk" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c75468d6-7937-41d3-aaa8-89e12b4565fe", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "Spaanse helm" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c8909290-95c2-4cbe-b202-ca66dc0573a2", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "witbakkend aardewerk:grape" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c8fab5ab-ecd1-4436-86a0-d0f0d8c210ed", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "koolstronk" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c8ff7016-7484-425a-9c0a-af02c5700346", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "witbakkend geglazuurd:grape - Weser" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ccbfad71-730c-4df3-b830-be5757eb8d69", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "roodbakkend aardewerk:test" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ccc17770-e195-4028-808f-1dfb0cd9c8c0", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "hoofdnaald" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/cd883dc5-7505-45ee-b7f9-8121f336966c", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "Weser aardewerk" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/cdcf7ca0-2a2f-4977-b766-2db4ac707e49", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "majolica:kom - Zuidnederlands" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/cf2dcb18-ef04-4e2b-88d3-73a3d77d4253", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "witbakkend geglazuurd:kom - Saintonge" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d05f1bf8-2d4b-416f-ab40-8e45549351cd", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "Italiaans majolica:kom" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d30e67db-f489-4230-9496-befaa1d00caf", + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d4a79e6c-b2f7-4a72-83f0-8074fc2250df", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "kruisboog tuimelaar" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d60b61ba-aaef-407f-be19-14535f4e20f6", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "haakbus" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d6b7aea7-7af4-4ed7-a048-20b07201985b", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:beker - Keuls" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d80b7b40-46ad-412d-83c0-12794fe2e687", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "degen" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d98a6cb4-19f1-4720-8476-dfb29e039536", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "rijksdaalder" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/da3e2660-a17a-4f33-9d48-91af55289cee", + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/da424f12-aa83-4549-b83e-6faf9ac15bce", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "Werra aardewerk" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/da7626e0-13c3-4ef7-ba3c-a30da67492c5", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "majolica:zalfpot - Noordnederlands" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/dc100908-694b-49dd-9d54-e5304e85fabd", + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/dd3b313e-f640-4f52-afcd-93a63157c61d", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "Limburgs witbakkend geglazuurd:kom" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ddf5517c-2026-4e38-8e2f-d30524068fce", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "Spaanse mat" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e0a42c1f-cce6-42a7-8235-aa835246ab8a", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "majolica:kom - Noordnederlands" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e27f9d00-d79a-4a51-a459-5ce37b4ee721", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "pijpenpot" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e2c0a298-fdd6-4494-95f8-937a82b0eb7c", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed:beker" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e33deb26-b2d1-4da6-aaaa-1c66fc158a4a", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "vuurbok" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e37b6b91-bcbd-4f38-b2e6-f90783ec0566", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "witbakkend geglazuurd:kan - Weser" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e526f544-3a01-4b5c-a3e4-ee8bd5307442", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "wandtegel:majolica, Zuidnederlands" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e5c5e22d-eac4-4b37-a9e1-e493c1e33cc9", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "halve gouden rijder" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e71fd74c-95d4-4aeb-9810-e6e96c5abb20", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "nestel" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e8cd7206-b5c7-41d3-ad3d-93f262829ae3", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "kom - tazza/drinkschaal op voet:kottman taz1" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e91f2545-74e1-4078-8631-178f600d4d06", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "flabbe" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/eb116fc9-b02d-4479-aa9f-e91f927ed2dd", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "witbakkend aardewerk:deksel" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f010757f-3707-47ec-bbca-311aac3e97ae", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "laars" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f0198c4c-305e-4ea1-9c7d-721754329dc1", + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f02b275f-76b9-4f23-8ede-490f14f865ff", + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f07317c7-a4a6-4519-a29b-affdcb70a654", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "kacheltegel" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f4d851ac-44f1-4a39-ab52-d0dcfb157c10", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "roodbakkend geglazuurd:kruik - slibversierd" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f558a608-fc4b-4632-ab1d-67c8e59b70d0", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "wijnfles" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f6115f61-a3b9-4964-847f-6712b8b96c3c", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "steengoed geglazuurd:kruik - Westerwalds" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f75b7ee2-20e6-4705-9793-6309974d4592", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "roodbakkend geglazuurd:bord - ringeloorversierd" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f7fe1780-a3ca-44e3-a5dd-48d4e2d735da", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "gosseler" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f93c27fd-d5f6-486c-9a85-900cd9d81b51", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "roodbakkend geglazuurd:bord - gemarmerd" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f98ecbbb-d90a-4dc5-ba1f-cf8a16808019", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "florijn" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f9a94eba-cb48-4886-996f-6800016a4146", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "jacht" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f9b0710a-af3c-4b95-bcb6-e255e2421249", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "beker - noppenbeker:kottman nop1-3" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fb14e43f-7f9d-4047-8617-2e34c96fdc96", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "roemer" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fbf3e853-f9f7-4329-bad2-0da6a2c9291a", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "pijlpunt" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fddb751a-f3a8-4201-962b-b407cdcc02e2", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "spinklos" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fdef7a76-b003-47ca-82a4-2b513e03790e", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "waterfluit" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fe79c87d-696d-4fc5-a028-85fa910b91d8", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "Limburgs witbakkend geglazuurd:grape" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fe90b617-55cb-4798-9a24-971ea5f488c9", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "albus" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + }, { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ff54886c-f8ce-458b-813f-bbccbdf214d8", + "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], + "prefLabel" : { + "lang" : "nl", + "value" : "braadspit" + }, + "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { + "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" + } + } ] } \ No newline at end of file From 3b0b6766d1305acf154c1310c8ca0fbcb577b18b Mon Sep 17 00:00:00 2001 From: jo-pol Date: Mon, 28 Apr 2025 15:07:29 +0200 Subject: [PATCH 018/470] dropped second abrPeriod --- .../DatasetFieldServiceBeanDansTest.java | 20 +- .../json/cvoc-dans-value/abrPeriod-2.json | 2944 ----------------- .../{abrPeriod-1.json => abrPeriod.json} | 0 3 files changed, 2 insertions(+), 2962 deletions(-) delete mode 100644 src/test/resources/json/cvoc-dans-value/abrPeriod-2.json rename src/test/resources/json/cvoc-dans-value/{abrPeriod-1.json => abrPeriod.json} (100%) diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java index ff2cf7921d3..6f2d4bb580d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java @@ -105,10 +105,10 @@ void getIndexableStringsForAudience() throws Exception { } @Test - void getIndexableStringsForAbrPeriod1() throws Exception { + void getIndexableStringsForAbrPeriod() throws Exception { String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/19679187-0ac4-4127-b4cd-09a348400585"; JsonObject cvocEntry = createMocks("dansAbrPeriod", termURI, "abrPeriod.json"); - JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/abrPeriod-1.json"); + JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/abrPeriod.json"); JsonObject result = (JsonObject) reflectFilterResponse().invoke(datasetFieldServiceBean, cvocEntry, readObject, termURI); @@ -120,22 +120,6 @@ void getIndexableStringsForAbrPeriod1() throws Exception { assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri"); } - @Test - void getIndexableStringsForAbrPeriod2() throws Exception { - String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/19679187-0ac4-4127-b4cd-09a348400585"; - JsonObject cvocEntry = createMocks("dansAbrPeriod", termURI, "abrPeriod.json"); - JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/abrPeriod-2.json"); - - JsonObject result = (JsonObject) reflectFilterResponse().invoke(datasetFieldServiceBean, cvocEntry, readObject, termURI); - - List expectedValues = List.of( - "Eerste Wereldoorlog" - ); - assertThat(result.getString("@id")).isEqualTo(termURI); - assertTermNameValues(result, expectedValues); - assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri"); - } - private void assertTermNameValues(JsonObject result, List expectedValues) { assertThat(termNameValues(result)) .withFailMessage("Expected result with termName values: %s but got: %s", expectedValues, result) diff --git a/src/test/resources/json/cvoc-dans-value/abrPeriod-2.json b/src/test/resources/json/cvoc-dans-value/abrPeriod-2.json deleted file mode 100644 index 30db15ae569..00000000000 --- a/src/test/resources/json/cvoc-dans-value/abrPeriod-2.json +++ /dev/null @@ -1,2944 +0,0 @@ -{ - "@context" : { - "skos" : "http://www.w3.org/2004/02/skos/core#", - "isothes" : "http://purl.org/iso25964/skos-thes#", - "rdfs" : "http://www.w3.org/2000/01/rdf-schema#", - "owl" : "http://www.w3.org/2002/07/owl#", - "dct" : "http://purl.org/dc/terms/", - "dc11" : "http://purl.org/dc/elements/1.1/", - "uri" : "@id", - "type" : "@type", - "lang" : "@language", - "value" : "@value", - "graph" : "@graph", - "label" : "rdfs:label", - "prefLabel" : "skos:prefLabel", - "altLabel" : "skos:altLabel", - "hiddenLabel" : "skos:hiddenLabel", - "broader" : "skos:broader", - "narrower" : "skos:narrower", - "related" : "skos:related", - "inScheme" : "skos:inScheme", - "exactMatch" : "skos:exactMatch", - "closeMatch" : "skos:closeMatch", - "broadMatch" : "skos:broadMatch", - "narrowMatch" : "skos:narrowMatch", - "relatedMatch" : "skos:relatedMatch" - }, - "graph" : [ { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/004f5603-faec-4772-acea-daa4aa24c03b", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed met secundair lood- of tinglazuur" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0113e071-d5f8-477a-99e6-788c5c69a53d", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "fles - bolvormig op voet:kottman fle13" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/013dafbb-285e-4aa9-8ffa-fb97b46b6aea", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "pijp (bouwmateriaal)" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/01628d5b-e55a-48f1-9992-8f107671d728", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "anderhalfhandzwaard" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/04f39851-fb9b-4eba-9f2a-c5dd24c62791", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:beker - Westerwalds" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/05ea0275-6619-4a79-bc1f-f97741e2a89d", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "witbakkend geglazuurd:beker - Langerwehe witbakkend" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0791023c-74d0-4d7c-9db0-4808cc0d6ff7", - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0982f293-db33-4f70-8132-32e7a76af6da", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:kan - Keuls" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/09f48cf7-57ef-457c-a09f-4b6076fa525b", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "snaphaan" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0a6b9481-6b71-4b8d-89ad-4ba763a0cc07", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "majolica uit de Nederlanden:zalfpot" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0a7d7db7-a8ff-4751-afbc-0c362652e8c6", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "Husum aardewerk" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0c78785a-e2aa-41ec-8e06-f7ca132e3ce4", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "fles - kottman fle1-12/14-32" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0e3f035d-aa91-4799-b7a3-7964e12cbcdf", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "gordelsluiting driedelig" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/103df23a-3fec-4c20-9dc5-9b7b33c7e1f0", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "ruiterhelm" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/10fa72e0-d8f5-4391-92f0-9428a7aa9def", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "roodbakkend geglazuurd:tuitpot" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/1273e5ef-faa8-4c1b-8f5a-773f3e83f962", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "rood- of witbakkend aardewerk uit het Iberisch Schiereiland:pot" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/13380260-8bf0-4846-9361-e94515b4d6b6", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "kledinghaak" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/13d8f79b-9c91-49a1-9c10-beb8385179de", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "gouden rijder" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/14f0abda-e5c8-458b-b985-8e564b595bf4", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "kruithoorn" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/152da0a7-7d3d-493c-8cc7-1c2094b040fd", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "gildepenning" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/1566f1f4-b766-4133-b760-9cc0375db9ed", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "pistool" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/18d1eac7-3e98-423b-b947-760d48475b92", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:voorraadvat" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/1bbcf64b-6c42-4458-a680-07359d19761e", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "schild" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/1c1e666c-817f-49d3-b881-1429acf80964", - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/1f9e6cef-13d9-4011-8cf9-b830e374a245", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "witbakkend geglazuurd:vergiet" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2012cf66-384c-4f9a-ac3b-99edd35ff7cd", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "rolpaard" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/215d59d3-3086-45be-b0c5-f2dc249bb024", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "Italiaans majolica:bord" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/21f08f36-65fa-47e7-b952-4b7e94784053", - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2205f27a-7565-4bea-91df-40ab4d6b83d3", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "majolica uit de Nederlanden:kruik" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/22b49544-4432-4286-81f7-246ade5c5544", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "majolica:kan" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2381f691-11e9-42f4-a81b-43390b727115", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed Siegburg" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/25ea9fe9-c6e2-43c9-b797-06b06cf38784", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "angelot" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/28924089-dbee-4053-9b29-a18ebbb4dd70", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "3 guldenstuk" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2a2b50fe-0ac3-4f40-86c7-21d443a7dda4", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "schelling" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2a347dff-f219-490a-8691-f2c8d8fd1f5b", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "roodbakkend geglazuurd:kom - gemarmerd" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2b14db48-5875-41aa-8a99-579821c24344", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "jager" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2c4ae3a0-bca7-4073-b59d-bf486772209f", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed:kan - Langerwehe" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2d3c54b5-fc4a-4a8f-a8ca-15322cfb5b92", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "hafneraardewerk:zuigfles" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2dc88096-e3db-4690-9456-3538265f4ad8", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "dubloen" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2eb6a4fd-c260-4c99-ab0d-0f7f98fb09c3", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "korte" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2ef593dc-a3c8-4a13-a481-0f61f897fe10", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "rood- of witbakkend aardewerk uit het Iberisch Schiereiland:kruik" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2f2a5230-7a76-493a-a019-87e33f6459fd", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "majolica uit de Nederlanden" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2ff0cd33-221e-4562-9327-79ea111e679d", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "witbakkend geglazuurd:kan - Rijnlands" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3157854b-9675-4fdf-a72e-5099dac51714", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "Engels witbakkend aardewerk" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/31ee8678-c485-4519-9744-60ceb53b2273", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "borstkuras" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/322ac368-452d-4221-97ba-1e39c47b1e31", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:pispot - Raerens" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3287454d-3189-436b-9d97-b2fe9639ba55", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "landsknechtzwaard" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/33221058-d887-463f-80ae-9b2623c833c5", - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/361853e8-55a7-4f1d-8ffd-8576686660d2", - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3679f79a-1a0e-4f70-99c5-1246ce72d87f", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "hafneraardewerk:beker" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/381756bc-68c5-4de5-8550-6213bf50a2b6", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "beenpijp" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/387209a6-65dd-4d23-acc4-6fa48b1ff286", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "majolica:bord - Zuidnederlands" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/38b1e07a-cd17-4431-88a2-c10ce618a84e", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:kom" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/391b53f9-3c69-42f7-a9fa-b9cf0aec9c18", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "witbakkend geglazuurd:bord - Weser" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3b33c878-931e-4805-80f4-77a490e80ad0", - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3ca60c2d-0388-4544-b7b4-5f1062d2ffdf", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "roodbakkend geglazuurd:kom - Werra/Wanfried/Enkhuizer/Hessisch" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3d8cdff2-e7c0-402f-bed2-2f9ecef6aaab", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "slang" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3eb952ef-1e04-4fba-b29b-43a0ffb2b783", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:kan - Siegburgs" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3efaf1ae-dcb7-443c-bcd7-14283bdf74b5", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:kruik - Raerens" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3fe74d96-4ae0-4642-a3f1-d85c23df8341", - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/47cd1d16-de7a-4344-96a2-0d21154087dc", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:beker - Frechen" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6", - "type" : [ "skos:Concept", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "https://data.cultureelerfgoed.nl/id/rnce#PeriodAbr" ], - "altLabel" : { - "lang" : "nl", - "value" : "Nieuwe Tijd A" - }, - "broader" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c6858173-5ca2-4319-b242-f828ec53d52d" - }, - "skos:hiddelLabel" : { - "lang" : "nl", - "value" : "NTV" - }, - "prefLabel" : { - "lang" : "nl", - "value" : "Nieuwe Tijd Vroeg" - }, - "skos:scopeNote" : { - "lang" : "nl", - "value" : "Periode tussen 1500 en 1650 waarin Nederland als politiek-bestuurlijke entiteit deels vorm krijgt als Republiek der Zeven Verenigde Nederlanden (1579). Het einde wordt gemarkeerd door de Vrede van Munster (1648). Deze periode wordt gekenmerkt door militair conflict, de reformatie, renaissance, ontstaan van de wereldhandel, economische voorspoed en specialisatie en een explosieve groei van steden in Holland en Zeeland (vooral Amsterdam)." - }, - "https://data.cultureelerfgoed.nl/id/rnce#beginYearAbr" : 1500, - "https://data.cultureelerfgoed.nl/id/rnce#codeAbr" : { - "lang" : "nl", - "value" : "NTV" - }, - "https://data.cultureelerfgoed.nl/id/rnce#endYearAbr" : 1649, - "https://data.cultureelerfgoed.nl/id/rnce#isBeginPeriodAbrOf" : [ { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e91f2545-74e1-4078-8631-178f600d4d06" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e5c5e22d-eac4-4b37-a9e1-e493c1e33cc9" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/09f48cf7-57ef-457c-a09f-4b6076fa525b" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/bed37866-17c8-49d8-89f1-d7b1ba045341" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f7fe1780-a3ca-44e3-a5dd-48d4e2d735da" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d60b61ba-aaef-407f-be19-14535f4e20f6" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c75468d6-7937-41d3-aaa8-89e12b4565fe" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/793ab729-5d11-4794-99e3-6114458cbb50" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2a347dff-f219-490a-8691-f2c8d8fd1f5b" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/cf2dcb18-ef04-4e2b-88d3-73a3d77d4253" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3ca60c2d-0388-4544-b7b4-5f1062d2ffdf" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8708f8a7-0b1d-418d-ba4b-5bca2254bd10" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c8ff7016-7484-425a-9c0a-af02c5700346" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8add3bf4-b408-4dbd-ac95-7a1570b0c99e" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6d64575b-13b9-4b39-aaf1-3c31da837ed0" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d6b7aea7-7af4-4ed7-a048-20b07201985b" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b2b23c7b-fabd-4996-a5c7-2c60842a71cb" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/47cd1d16-de7a-4344-96a2-0d21154087dc" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a6bbe3bb-838c-4f46-a0c6-2b935dc0df87" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b4315238-a53e-40a5-aa04-66278b102798" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f93c27fd-d5f6-486c-9a85-900cd9d81b51" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b3790c6d-cee2-4e6c-baf4-40fd4166c77b" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/391b53f9-3c69-42f7-a9fa-b9cf0aec9c18" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8c35015e-0861-4f8d-a341-c4f44f5de3f7" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/585b3359-ddf2-44e7-9568-6aa232b29834" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/99c19a14-47a8-4143-9581-d5a4344c2b02" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f6115f61-a3b9-4964-847f-6712b8b96c3c" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/584c39ac-11c6-44d4-bc5f-36c5abbeea99" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9304db0a-73c1-43e1-af04-a95fc538fae4" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a68f9ac0-cc2a-4574-a116-c611f6f06b79" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e8cd7206-b5c7-41d3-ad3d-93f262829ae3" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5aa462d5-3ac9-4db1-a36d-a64471f96dbb" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/55d7b468-303c-4874-a0d9-036f7720d7b6" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2ff0cd33-221e-4562-9327-79ea111e679d" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/797b6c65-e8e0-434d-be9c-9c1be6b64ca5" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0982f293-db33-4f70-8132-32e7a76af6da" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a5b85eb3-1774-4382-a3b5-24166f963a77" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3eb952ef-1e04-4fba-b29b-43a0ffb2b783" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7219f188-3fa7-450b-9e8e-70db72916475" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7fc9a3a6-3de8-4adc-9672-d69aee99c942" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/54f59147-a7ef-4e9d-92dc-52a306392887" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e71fd74c-95d4-4aeb-9810-e6e96c5abb20" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/152da0a7-7d3d-493c-8cc7-1c2094b040fd" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/61e4c4b4-3ae2-4ac9-b915-4cd527fd8367" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/4ede7c26-abdb-4aae-834b-410a7dce5582" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d80b7b40-46ad-412d-83c0-12794fe2e687" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/64f095f5-94ee-40b3-ad44-1b26a0bbf67d" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/14f0abda-e5c8-458b-b985-8e564b595bf4" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f558a608-fc4b-4632-ab1d-67c8e59b70d0" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e0a42c1f-cce6-42a7-8235-aa835246ab8a" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/cdcf7ca0-2a2f-4977-b766-2db4ac707e49" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fb14e43f-7f9d-4047-8617-2e34c96fdc96" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b0f413b5-7cb1-410b-8d96-69685f251273" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/04f39851-fb9b-4eba-9f2a-c5dd24c62791" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f75b7ee2-20e6-4705-9793-6309974d4592" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/387209a6-65dd-4d23-acc4-6fa48b1ff286" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ac07ea63-143f-4e32-9b05-44ea4c539eb8" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3efaf1ae-dcb7-443c-bcd7-14283bdf74b5" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8beb812f-3ec2-494f-9f5a-27f2cb7534d3" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/59dff97e-afd1-4190-a571-e575cb8e6b34" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/322ac368-452d-4221-97ba-1e39c47b1e31" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/4fd383d7-0740-4aef-8d73-be36590832a2" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/bbbd88ed-815e-47b1-9d07-64a27e6d9c64" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7dfd2aae-688c-44f6-9187-214ead9322e5" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9e13425d-cf94-4b4c-8752-302596c9061f" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e526f544-3a01-4b5c-a3e4-ee8bd5307442" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9727fd31-90c7-40e7-a673-39d481f5e7b8" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6b66f4d2-3c58-44b9-818f-2a94b91528d8" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/da7626e0-13c3-4ef7-ba3c-a30da67492c5" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9ac57e3d-697f-4331-942f-2daa66596c22" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a55c4e4e-4e3c-4da0-acaa-07bc45dfe147" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/72adce71-110f-40c0-9cff-ead9dfba636f" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2dc88096-e3db-4690-9456-3538265f4ad8" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d98a6cb4-19f1-4720-8476-dfb29e039536" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a116858a-f4e7-4a21-9a01-c835306702ba" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/28924089-dbee-4053-9b29-a18ebbb4dd70" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/1566f1f4-b766-4133-b760-9cc0375db9ed" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2012cf66-384c-4f9a-ac3b-99edd35ff7cd" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f010757f-3707-47ec-bbca-311aac3e97ae" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c64ae6af-abdf-4376-8092-a68337b9f571" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fdef7a76-b003-47ca-82a4-2b513e03790e" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0c78785a-e2aa-41ec-8e06-f7ca132e3ce4" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/907cc275-8b04-44f8-ac8a-29fad197fc42" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7227c115-166c-442f-be14-c5c7c99cc1cd" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8d613113-dce7-4eea-b35a-7b10b841d524" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/18d1eac7-3e98-423b-b947-760d48475b92" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/10fa72e0-d8f5-4391-92f0-9428a7aa9def" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/1f9e6cef-13d9-4011-8cf9-b830e374a245" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/62909c16-d305-4b89-9753-c278d01eca3e" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f9a94eba-cb48-4886-996f-6800016a4146" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3d8cdff2-e7c0-402f-bed2-2f9ecef6aaab" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9ca1d5b2-5e61-403b-902b-eced0b4f1b63" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ab5d6a35-94eb-40a8-bea1-418273bf06ed" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e27f9d00-d79a-4a51-a459-5ce37b4ee721" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/013dafbb-285e-4aa9-8ffa-fb97b46b6aea" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5c6add3c-f39c-4fb2-8957-87d7bba6a6da" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7d50dce3-abe2-4e62-9b17-4c82658891b9" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ba06f5f1-6480-4119-9ad0-2162c8e6a1f9" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2a2b50fe-0ac3-4f40-86c7-21d443a7dda4" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/491c1df4-1cd7-4dad-8915-78f1a5eb619f" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ddf5517c-2026-4e38-8e2f-d30524068fce" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/84cb2e0c-58f9-4e38-ad95-73bc5cc07175" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6412fa9c-9840-46c8-ab73-86b021307e32" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/13d8f79b-9c91-49a1-9c10-beb8385179de" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f98ecbbb-d90a-4dc5-ba1f-cf8a16808019" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8ea89171-a104-40ab-abab-9a9471d10128" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/764d25fa-5287-421c-bdbf-7a5feb052d0a" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/619624e1-8792-41d0-867d-634ab89a5e15" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2205f27a-7565-4bea-91df-40ab4d6b83d3" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0a6b9481-6b71-4b8d-89ad-4ba763a0cc07" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9c2398fd-891f-405e-9f2a-12955a2ca888" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2f2a5230-7a76-493a-a019-87e33f6459fd" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6bacf1ec-1217-4cc8-92ca-77f938bd7e51" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/38b1e07a-cd17-4431-88a2-c10ce618a84e" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6c3d30c8-760b-478e-9141-abcdf260f211" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/68dc9ec5-68cb-43d1-9d5e-c6ac9e14c8e6" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5fd26266-df1d-4dbf-b8f2-49a58523a032" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ccbfad71-730c-4df3-b830-be5757eb8d69" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a1d70518-21aa-409d-906f-dcee5da1e126" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3679f79a-1a0e-4f70-99c5-1246ce72d87f" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/84e72199-94fa-447f-b100-59d96a64744e" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b2d3ad6e-f522-4433-9d8a-e1dd85c661ed" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e37b6b91-bcbd-4f38-b2e6-f90783ec0566" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/eb116fc9-b02d-4479-aa9f-e91f927ed2dd" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/74722c90-928f-4eb1-ba7e-929e2368e012" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5d639d90-e1d8-491a-bb16-d196b45fc34c" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/924d0bcc-e4ad-4d31-8ac6-8e9a68ed276e" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/cd883dc5-7505-45ee-b7f9-8121f336966c" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3157854b-9675-4fdf-a72e-5099dac51714" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b0c25500-2d51-4b9e-8959-0c413c31bd1a" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2ef593dc-a3c8-4a13-a481-0f61f897fe10" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/1273e5ef-faa8-4c1b-8f5a-773f3e83f962" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c52310e1-7ee2-439b-85b9-56f97d901968" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/76a5ac62-4cd1-461d-b1b1-d5bc833ee091" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0a7d7db7-a8ff-4751-afbc-0c362652e8c6" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/da424f12-aa83-4549-b83e-6faf9ac15bce" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c742516b-2a85-4abb-80c9-ea5661ed20a5" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b69eab67-921c-4911-9306-c0a24960779e" - } ], - "https://data.cultureelerfgoed.nl/id/rnce#isEndPeriodAbrOf" : [ { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e91f2545-74e1-4078-8631-178f600d4d06" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e5c5e22d-eac4-4b37-a9e1-e493c1e33cc9" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/09f48cf7-57ef-457c-a09f-4b6076fa525b" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/bed37866-17c8-49d8-89f1-d7b1ba045341" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f7fe1780-a3ca-44e3-a5dd-48d4e2d735da" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d60b61ba-aaef-407f-be19-14535f4e20f6" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c75468d6-7937-41d3-aaa8-89e12b4565fe" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/793ab729-5d11-4794-99e3-6114458cbb50" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2a347dff-f219-490a-8691-f2c8d8fd1f5b" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/cf2dcb18-ef04-4e2b-88d3-73a3d77d4253" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3ca60c2d-0388-4544-b7b4-5f1062d2ffdf" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8708f8a7-0b1d-418d-ba4b-5bca2254bd10" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c8ff7016-7484-425a-9c0a-af02c5700346" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8add3bf4-b408-4dbd-ac95-7a1570b0c99e" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6d64575b-13b9-4b39-aaf1-3c31da837ed0" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d6b7aea7-7af4-4ed7-a048-20b07201985b" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b2b23c7b-fabd-4996-a5c7-2c60842a71cb" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/47cd1d16-de7a-4344-96a2-0d21154087dc" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a6bbe3bb-838c-4f46-a0c6-2b935dc0df87" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b4315238-a53e-40a5-aa04-66278b102798" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f93c27fd-d5f6-486c-9a85-900cd9d81b51" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b3790c6d-cee2-4e6c-baf4-40fd4166c77b" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/391b53f9-3c69-42f7-a9fa-b9cf0aec9c18" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8c35015e-0861-4f8d-a341-c4f44f5de3f7" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/585b3359-ddf2-44e7-9568-6aa232b29834" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/99c19a14-47a8-4143-9581-d5a4344c2b02" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f6115f61-a3b9-4964-847f-6712b8b96c3c" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/584c39ac-11c6-44d4-bc5f-36c5abbeea99" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9304db0a-73c1-43e1-af04-a95fc538fae4" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a68f9ac0-cc2a-4574-a116-c611f6f06b79" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e8cd7206-b5c7-41d3-ad3d-93f262829ae3" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5aa462d5-3ac9-4db1-a36d-a64471f96dbb" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/55d7b468-303c-4874-a0d9-036f7720d7b6" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2ff0cd33-221e-4562-9327-79ea111e679d" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/797b6c65-e8e0-434d-be9c-9c1be6b64ca5" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0982f293-db33-4f70-8132-32e7a76af6da" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a5b85eb3-1774-4382-a3b5-24166f963a77" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3eb952ef-1e04-4fba-b29b-43a0ffb2b783" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7219f188-3fa7-450b-9e8e-70db72916475" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7fc9a3a6-3de8-4adc-9672-d69aee99c942" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/54f59147-a7ef-4e9d-92dc-52a306392887" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a55c4e4e-4e3c-4da0-acaa-07bc45dfe147" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/72adce71-110f-40c0-9cff-ead9dfba636f" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/573c416b-c9ce-430a-9944-4a4f12c5753e" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e33deb26-b2d1-4da6-aaaa-1c66fc158a4a" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ff54886c-f8ce-458b-813f-bbccbdf214d8" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fe90b617-55cb-4798-9a24-971ea5f488c9" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2eb6a4fd-c260-4c99-ab0d-0f7f98fb09c3" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2b14db48-5875-41aa-8a99-579821c24344" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6e749426-f0f4-42bc-b8c7-6ebffad97c64" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5cd02de2-76da-401a-ab22-adfe9e42511f" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7e6200ec-e31f-4594-bdf0-65b3f5b5c981" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/25ea9fe9-c6e2-43c9-b797-06b06cf38784" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/13380260-8bf0-4846-9361-e94515b4d6b6" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5c6c4967-1a4e-45aa-ad46-c770803ae0f6" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ccc17770-e195-4028-808f-1dfb0cd9c8c0" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d4a79e6c-b2f7-4a72-83f0-8074fc2250df" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c11c65bb-8df2-403f-b552-9c661a87b2f1" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/01628d5b-e55a-48f1-9992-8f107671d728" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3287454d-3189-436b-9d97-b2fe9639ba55" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/759f3936-b94d-47bb-847f-2a325a0ce0e4" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/31ee8678-c485-4519-9744-60ceb53b2273" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/381756bc-68c5-4de5-8550-6213bf50a2b6" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8a76c93b-62fa-4418-8460-d005a1b9b9f2" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0113e071-d5f8-477a-99e6-788c5c69a53d" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5cebec5e-8a4a-44ad-9d62-5a1df4988ff8" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/dd3b313e-f640-4f52-afcd-93a63157c61d" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7f5bd9ac-9e23-4cfc-9b97-1114a0b8afcf" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fe79c87d-696d-4fc5-a028-85fa910b91d8" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/05ea0275-6619-4a79-bc1f-f97741e2a89d" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f9b0710a-af3c-4b95-bcb6-e255e2421249" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e2c0a298-fdd6-4494-95f8-937a82b0eb7c" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c8fab5ab-ecd1-4436-86a0-d0f0d8c210ed" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6350286f-e186-4811-b753-3d5eda0970d1" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/819dbe92-1392-4872-aa84-7706e1c7b5cc" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f4d851ac-44f1-4a39-ab52-d0dcfb157c10" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6aab7f0c-e795-4fd8-b7b9-289bc844ad65" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2c4ae3a0-bca7-4073-b59d-bf486772209f" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/50cafd45-5e2e-422e-b8cb-fa045028defe" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/745968db-e7be-4631-b143-c92e517d54c6" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/22b49544-4432-4286-81f7-246ade5c5544" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ab413d2f-b562-4446-8fe4-4e17ad5fe1ea" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a7b726b5-2cb6-456d-9d30-eaea452a1af6" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b94bd49e-b7da-4584-b5bf-84e808c15f13" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/0e3f035d-aa91-4799-b7a3-7964e12cbcdf" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a96512e5-1927-43c4-b9a8-1596633512ab" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a2491e0b-d340-4f5b-a2cb-7360251065c6" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/724bc219-1321-486c-864a-90b928fad30d" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f07317c7-a4a6-4519-a29b-affdcb70a654" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8926b374-3b17-412d-943b-702c0803ea19" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/491c1df4-1cd7-4dad-8915-78f1a5eb619f" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ddf5517c-2026-4e38-8e2f-d30524068fce" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/84cb2e0c-58f9-4e38-ad95-73bc5cc07175" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f98ecbbb-d90a-4dc5-ba1f-cf8a16808019" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9f5c62ab-8820-48b2-98a4-2d7c8689cf24" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5a5f9b0a-4836-4d48-b1d1-5c08510818e3" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/4d3e1fc1-0b06-4034-b7b7-444255dce331" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/103df23a-3fec-4c20-9dc5-9b7b33c7e1f0" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/720160c2-1f9f-498e-87c1-a6f4f0eaba95" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/acdb07bf-fa05-4608-b263-3585e80eee1e" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fbf3e853-f9f7-4329-bad2-0da6a2c9291a" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/4bb2bac9-fcc9-4fa0-b593-750ebefac4bd" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/1bbcf64b-6c42-4458-a680-07359d19761e" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fddb751a-f3a8-4201-962b-b407cdcc02e2" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a5fe02c8-a620-4bf2-89e4-d819ece35729" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/91503be5-d1d1-4af9-8f90-304b5778edfe" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d05f1bf8-2d4b-416f-ab40-8e45549351cd" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/215d59d3-3086-45be-b0c5-f2dc249bb024" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/764d25fa-5287-421c-bdbf-7a5feb052d0a" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/88d5717a-ac49-43fa-8aa6-b77aa8508218" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2381f691-11e9-42f4-a81b-43390b727115" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2205f27a-7565-4bea-91df-40ab4d6b83d3" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5fd26266-df1d-4dbf-b8f2-49a58523a032" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/690f5913-5acd-4357-939f-2b852d878b9d" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/2d3c54b5-fc4a-4a8f-a8ca-15322cfb5b92" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/3679f79a-1a0e-4f70-99c5-1246ce72d87f" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/84e72199-94fa-447f-b100-59d96a64744e" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b2d3ad6e-f522-4433-9d8a-e1dd85c661ed" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/004f5603-faec-4772-acea-daa4aa24c03b" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/da424f12-aa83-4549-b83e-6faf9ac15bce" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b5e9d12c-b24a-47d8-981b-1a620ba10b2c" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c8909290-95c2-4cbe-b202-ca66dc0573a2" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e37b6b91-bcbd-4f38-b2e6-f90783ec0566" - } ], - "https://data.cultureelerfgoed.nl/id/rnce#sortPeriod" : "cba" - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/491c1df4-1cd7-4dad-8915-78f1a5eb619f", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "souverein" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/4bb2bac9-fcc9-4fa0-b593-750ebefac4bd", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "schede (dolk, zwaard of mes) - puntbeschermer" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/4d3e1fc1-0b06-4034-b7b7-444255dce331", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "nekschild" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/4ede7c26-abdb-4aae-834b-410a7dce5582", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "musket" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/4fd383d7-0740-4aef-8d73-be36590832a2", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:kan - Raerens" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/50cafd45-5e2e-422e-b8cb-fa045028defe", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed:kan - Middenlimburgs:paars oppervl/roze baksel" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/54f59147-a7ef-4e9d-92dc-52a306392887", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "witbakkend geglazuurd:vuurtest - Saintonge" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/55d7b468-303c-4874-a0d9-036f7720d7b6", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "witbakkend (geglazuurd):pot, bolvormig - Weser" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/573c416b-c9ce-430a-9944-4a4f12c5753e", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "armpijp" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/584c39ac-11c6-44d4-bc5f-36c5abbeea99", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "witbakkend geglazuurd:kruik - Weser" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/585b3359-ddf2-44e7-9568-6aa232b29834", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:kruik - Frechen" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/59dff97e-afd1-4190-a571-e575cb8e6b34", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:tuitpot" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5a5f9b0a-4836-4d48-b1d1-5c08510818e3", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "nobel" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5aa462d5-3ac9-4db1-a36d-a64471f96dbb", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "drinkuit" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5c6add3c-f39c-4fb2-8957-87d7bba6a6da", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "prikker" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5c6c4967-1a4e-45aa-ad46-c770803ae0f6", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "wambuis" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5cd02de2-76da-401a-ab22-adfe9e42511f", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "vlieger" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5cebec5e-8a4a-44ad-9d62-5a1df4988ff8", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "witbakkend geglazuurd:zuigfles - Langerwehe witbakkend" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5d639d90-e1d8-491a-bb16-d196b45fc34c", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "witbakkend aardewerk:kruik" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/5fd26266-df1d-4dbf-b8f2-49a58523a032", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed Raeren" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/619624e1-8792-41d0-867d-634ab89a5e15", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "faience uit de Nederlanden:zalfpot" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/61e4c4b4-3ae2-4ac9-b915-4cd527fd8367", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "bandelier" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/62909c16-d305-4b89-9753-c278d01eca3e", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "boegbeeld" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6350286f-e186-4811-b753-3d5eda0970d1", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "maigelein" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6412fa9c-9840-46c8-ab73-86b021307e32", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "duit" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/64f095f5-94ee-40b3-ad44-1b26a0bbf67d", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "musketflint" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/68dc9ec5-68cb-43d1-9d5e-c6ac9e14c8e6", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed Westerwald" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/690f5913-5acd-4357-939f-2b852d878b9d", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "roodbakkend aardewerk:vetvanger" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6aab7f0c-e795-4fd8-b7b9-289bc844ad65", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:kan - Akens" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6b66f4d2-3c58-44b9-818f-2a94b91528d8", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:zalfpot - Raerens" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6bacf1ec-1217-4cc8-92ca-77f938bd7e51", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "faience" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6c3d30c8-760b-478e-9141-abcdf260f211", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:zalfpot" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6d64575b-13b9-4b39-aaf1-3c31da837ed0", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "witbakkend geglazuurd:beker - Rijnlands" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/6e749426-f0f4-42bc-b8c7-6ebffad97c64", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "stoter" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/720160c2-1f9f-498e-87c1-a6f4f0eaba95", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "plavuis, ongeglazuurd" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7219f188-3fa7-450b-9e8e-70db72916475", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "roodbakkend geglazuurd:kan - gemarmerd" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7227c115-166c-442f-be14-c5c7c99cc1cd", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "bord - teljoor" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/724bc219-1321-486c-864a-90b928fad30d", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "nistegel" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/72adce71-110f-40c0-9cff-ead9dfba636f", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "ducaton" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7314382d-08ac-4274-b577-3b45982f3cc6", - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/745968db-e7be-4631-b143-c92e517d54c6", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed:kan" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/74722c90-928f-4eb1-ba7e-929e2368e012", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "witbakkend aardewerk:bord" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/759f3936-b94d-47bb-847f-2a325a0ce0e4", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "kruisboogpunt" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/764d25fa-5287-421c-bdbf-7a5feb052d0a", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "Italiaans majolica:kruik" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/76a5ac62-4cd1-461d-b1b1-d5bc833ee091", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "roodbakkend aardewerk uit Azië" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/793ab729-5d11-4794-99e3-6114458cbb50", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "witbakkend geglazuurd:deksel - Weser" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/797b6c65-e8e0-434d-be9c-9c1be6b64ca5", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:kan - Westerwalds" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7d50dce3-abe2-4e62-9b17-4c82658891b9", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "pruik" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7dfd2aae-688c-44f6-9187-214ead9322e5", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "kolfslof" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7e6200ec-e31f-4594-bdf0-65b3f5b5c981", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "scild" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7f5bd9ac-9e23-4cfc-9b97-1114a0b8afcf", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed:grape - Langerwehe" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/7fc9a3a6-3de8-4adc-9672-d69aee99c942", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "galjoen" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/819dbe92-1392-4872-aa84-7706e1c7b5cc", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "roodbakkend geglazuurd:bord - sgrafitto" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/84cb2e0c-58f9-4e38-ad95-73bc5cc07175", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "reaal" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/84e72199-94fa-447f-b100-59d96a64744e", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "hafneraardewerk:kruik" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8708f8a7-0b1d-418d-ba4b-5bca2254bd10", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "witbakkend geglazuurd:kom - Weser" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/88d5717a-ac49-43fa-8aa6-b77aa8508218", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed:grape" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8926b374-3b17-412d-943b-702c0803ea19", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "plavuis, geglazuurd" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8a76c93b-62fa-4418-8460-d005a1b9b9f2", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "vuurstolp - roodbakkend geglazuurd halfronde vorm" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8add3bf4-b408-4dbd-ac95-7a1570b0c99e", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "berkemeier" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8beb812f-3ec2-494f-9f5a-27f2cb7534d3", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "Loire:kruik" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8c35015e-0861-4f8d-a341-c4f44f5de3f7", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:kruik - Siegburgs" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8d613113-dce7-4eea-b35a-7b10b841d524", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "kelkglas" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/8ea89171-a104-40ab-abab-9a9471d10128", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "dukaat" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/907cc275-8b04-44f8-ac8a-29fad197fc42", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "roodbakkend geglazuurd:teil - slibversierd" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/91503be5-d1d1-4af9-8f90-304b5778edfe", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "Frans majolica:zalfpot" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/924d0bcc-e4ad-4d31-8ac6-8e9a68ed276e", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "dieburgaardewerk" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9304db0a-73c1-43e1-af04-a95fc538fae4", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "majolica:kruik - Zuidnederlands" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9727fd31-90c7-40e7-a673-39d481f5e7b8", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "wandtegel:majolica" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/99c19a14-47a8-4143-9581-d5a4344c2b02", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:kruik - Keuls" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9ac57e3d-697f-4331-942f-2daa66596c22", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "majolica:zalfpot - Zuidnederlands" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9c2398fd-891f-405e-9f2a-12955a2ca888", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "faience uit de Nederlanden" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9c6647c9-321e-47ab-9158-5c6fc47c9238", - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9ca1d5b2-5e61-403b-902b-eced0b4f1b63", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "pompleer" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9e13425d-cf94-4b4c-8752-302596c9061f", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "wandtegel:majolica, Noordnederlands" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/9f5c62ab-8820-48b2-98a4-2d7c8689cf24", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "groot" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a116858a-f4e7-4a21-9a01-c835306702ba", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "cent" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a1d70518-21aa-409d-906f-dcee5da1e126", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "roodbakkend Nederrijns aardewerk" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a2491e0b-d340-4f5b-a2cb-7360251065c6", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "baksteen - baksteen:volume ca. 1500-1000 cm3" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a55c4e4e-4e3c-4da0-acaa-07bc45dfe147", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "patagon" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a5b85eb3-1774-4382-a3b5-24166f963a77", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:kan - Frechen" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a5fe02c8-a620-4bf2-89e4-d819ece35729", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "pijlkoker" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a68f9ac0-cc2a-4574-a116-c611f6f06b79", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "majolica:kruik - Noordnederlands" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a6bbe3bb-838c-4f46-a0c6-2b935dc0df87", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:beker - Siegburgs" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a7b726b5-2cb6-456d-9d30-eaea452a1af6", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "karveel" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/a96512e5-1927-43c4-b9a8-1596633512ab", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "gesp - rechthoek" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ab0bcb0a-8345-491f-8c1e-f35ce8dcae41", - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ab413d2f-b562-4446-8fe4-4e17ad5fe1ea", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "hulk" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ab5d6a35-94eb-40a8-bea1-418273bf06ed", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "pen" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ac07ea63-143f-4e32-9b05-44ea4c539eb8", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "majolica:bord - Noordnederlands" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/acdb07bf-fa05-4608-b263-3585e80eee1e", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "kienspaanhouder" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b0c25500-2d51-4b9e-8959-0c413c31bd1a", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "faiencebiscuit" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b0f413b5-7cb1-410b-8d96-69685f251273", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:beker - Raerens" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b12050c3-afd4-490a-82fc-bff5d26f92a3", - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b2b23c7b-fabd-4996-a5c7-2c60842a71cb", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:beker - Duingen" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b2d3ad6e-f522-4433-9d8a-e1dd85c661ed", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "hafneraardewerk:kan" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b3790c6d-cee2-4e6c-baf4-40fd4166c77b", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "witbakkend geglazuurd:bord - Saintonge" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b3b4055c-d9d8-41e0-a125-26f6757c9145", - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b4315238-a53e-40a5-aa04-66278b102798", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "roodbakkend geglazuurd:bord - Werra/Wanfried/Enkhuizer/Hessisch" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b5e9d12c-b24a-47d8-981b-1a620ba10b2c", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "witbakkend aardewerk:pot" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b69eab67-921c-4911-9306-c0a24960779e", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "mediterraans slibaardewerk" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b91e387b-dc11-4e2a-85a5-c3ac15aed161", - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/b94bd49e-b7da-4584-b5bf-84e808c15f13", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "gordelketting" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ba06f5f1-6480-4119-9ad0-2162c8e6a1f9", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "daalder" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/bbbd88ed-815e-47b1-9d07-64a27e6d9c64", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "waterschip" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/bd652aac-4bf7-4b20-bfd8-8c1859725552", - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/bd9892e0-c000-48b0-8eff-1b14dfb5ff08", - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/bed37866-17c8-49d8-89f1-d7b1ba045341", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "Langrok" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c11c65bb-8df2-403f-b552-9c661a87b2f1", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "kruisboog" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c52310e1-7ee2-439b-85b9-56f97d901968", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "rood- of witbakkend aardewerk uit het Iberisch Schiereiland:amfoor" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c64ae6af-abdf-4376-8092-a68337b9f571", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "pantoffel" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c6858173-5ca2-4319-b242-f828ec53d52d", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#PeriodAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "narrower" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "prefLabel" : { - "lang" : "nl", - "value" : "Nieuwe Tijd" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c742516b-2a85-4abb-80c9-ea5661ed20a5", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "jydepotaardewerk" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c75468d6-7937-41d3-aaa8-89e12b4565fe", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "Spaanse helm" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c8909290-95c2-4cbe-b202-ca66dc0573a2", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "witbakkend aardewerk:grape" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c8fab5ab-ecd1-4436-86a0-d0f0d8c210ed", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "koolstronk" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/c8ff7016-7484-425a-9c0a-af02c5700346", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "witbakkend geglazuurd:grape - Weser" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ccbfad71-730c-4df3-b830-be5757eb8d69", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "roodbakkend aardewerk:test" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ccc17770-e195-4028-808f-1dfb0cd9c8c0", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "hoofdnaald" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/cd883dc5-7505-45ee-b7f9-8121f336966c", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "Weser aardewerk" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/cdcf7ca0-2a2f-4977-b766-2db4ac707e49", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "majolica:kom - Zuidnederlands" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/cf2dcb18-ef04-4e2b-88d3-73a3d77d4253", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "witbakkend geglazuurd:kom - Saintonge" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d05f1bf8-2d4b-416f-ab40-8e45549351cd", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "Italiaans majolica:kom" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d30e67db-f489-4230-9496-befaa1d00caf", - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d4a79e6c-b2f7-4a72-83f0-8074fc2250df", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "kruisboog tuimelaar" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d60b61ba-aaef-407f-be19-14535f4e20f6", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "haakbus" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d6b7aea7-7af4-4ed7-a048-20b07201985b", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:beker - Keuls" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d80b7b40-46ad-412d-83c0-12794fe2e687", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "degen" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/d98a6cb4-19f1-4720-8476-dfb29e039536", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "rijksdaalder" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/da3e2660-a17a-4f33-9d48-91af55289cee", - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/da424f12-aa83-4549-b83e-6faf9ac15bce", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategory", "https://data.cultureelerfgoed.nl/id/rnce#CeramicCategoryAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "Werra aardewerk" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/da7626e0-13c3-4ef7-ba3c-a30da67492c5", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "majolica:zalfpot - Noordnederlands" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/dc100908-694b-49dd-9d54-e5304e85fabd", - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/dd3b313e-f640-4f52-afcd-93a63157c61d", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "Limburgs witbakkend geglazuurd:kom" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ddf5517c-2026-4e38-8e2f-d30524068fce", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "Spaanse mat" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e0a42c1f-cce6-42a7-8235-aa835246ab8a", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "majolica:kom - Noordnederlands" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e27f9d00-d79a-4a51-a459-5ce37b4ee721", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "pijpenpot" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e2c0a298-fdd6-4494-95f8-937a82b0eb7c", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed:beker" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e33deb26-b2d1-4da6-aaaa-1c66fc158a4a", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "vuurbok" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e37b6b91-bcbd-4f38-b2e6-f90783ec0566", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "witbakkend geglazuurd:kan - Weser" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e526f544-3a01-4b5c-a3e4-ee8bd5307442", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "wandtegel:majolica, Zuidnederlands" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e5c5e22d-eac4-4b37-a9e1-e493c1e33cc9", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "halve gouden rijder" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e71fd74c-95d4-4aeb-9810-e6e96c5abb20", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "nestel" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e8cd7206-b5c7-41d3-ad3d-93f262829ae3", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "kom - tazza/drinkschaal op voet:kottman taz1" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/e91f2545-74e1-4078-8631-178f600d4d06", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "flabbe" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/eb116fc9-b02d-4479-aa9f-e91f927ed2dd", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "witbakkend aardewerk:deksel" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f010757f-3707-47ec-bbca-311aac3e97ae", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "laars" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f0198c4c-305e-4ea1-9c7d-721754329dc1", - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f02b275f-76b9-4f23-8ede-490f14f865ff", - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f07317c7-a4a6-4519-a29b-affdcb70a654", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "kacheltegel" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f4d851ac-44f1-4a39-ab52-d0dcfb157c10", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "roodbakkend geglazuurd:kruik - slibversierd" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f558a608-fc4b-4632-ab1d-67c8e59b70d0", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "wijnfles" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f6115f61-a3b9-4964-847f-6712b8b96c3c", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "steengoed geglazuurd:kruik - Westerwalds" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f75b7ee2-20e6-4705-9793-6309974d4592", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "roodbakkend geglazuurd:bord - ringeloorversierd" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f7fe1780-a3ca-44e3-a5dd-48d4e2d735da", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "gosseler" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f93c27fd-d5f6-486c-9a85-900cd9d81b51", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "roodbakkend geglazuurd:bord - gemarmerd" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f98ecbbb-d90a-4dc5-ba1f-cf8a16808019", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "florijn" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f9a94eba-cb48-4886-996f-6800016a4146", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "jacht" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/f9b0710a-af3c-4b95-bcb6-e255e2421249", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "beker - noppenbeker:kottman nop1-3" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fb14e43f-7f9d-4047-8617-2e34c96fdc96", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "roemer" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fbf3e853-f9f7-4329-bad2-0da6a2c9291a", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "pijlpunt" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fddb751a-f3a8-4201-962b-b407cdcc02e2", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "spinklos" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fdef7a76-b003-47ca-82a4-2b513e03790e", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "waterfluit" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasBeginPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fe79c87d-696d-4fc5-a028-85fa910b91d8", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "Limburgs witbakkend geglazuurd:grape" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/fe90b617-55cb-4798-9a24-971ea5f488c9", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "albus" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - }, { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/ff54886c-f8ce-458b-813f-bbccbdf214d8", - "type" : [ "https://data.cultureelerfgoed.nl/id/rnce#ArtefactAbr", "https://data.cultureelerfgoed.nl/id/rnce#AbrConcept", "skos:Concept" ], - "prefLabel" : { - "lang" : "nl", - "value" : "braadspit" - }, - "https://data.cultureelerfgoed.nl/id/rnce#hasEndPeriodAbr" : { - "uri" : "https://data.cultureelerfgoed.nl/term/id/abr/482e37cc-61f5-4e21-a331-e342ffadeff6" - } - } ] -} \ No newline at end of file diff --git a/src/test/resources/json/cvoc-dans-value/abrPeriod-1.json b/src/test/resources/json/cvoc-dans-value/abrPeriod.json similarity index 100% rename from src/test/resources/json/cvoc-dans-value/abrPeriod-1.json rename to src/test/resources/json/cvoc-dans-value/abrPeriod.json From 63d86d9dec4be24db5d6ba399727a872a409920d Mon Sep 17 00:00:00 2001 From: jo-pol Date: Tue, 29 Apr 2025 10:55:28 +0200 Subject: [PATCH 019/470] no mocking required --- .../DatasetFieldServiceBeanDansTest.java | 95 ++++++------------- .../cvoc-dans-config/AATClassification.json | 43 +-------- .../json/cvoc-dans-config/abrArtifact.json | 5 +- .../json/cvoc-dans-config/abrComplex.json | 4 +- .../json/cvoc-dans-config/abrPeriod.json | 5 +- .../json/cvoc-dans-config/abrRapportType.json | 4 +- .../cvoc-dans-config/abrVerwervingswijze.json | 4 +- .../json/cvoc-dans-config/audience.json | 4 +- .../json/cvoc-dans-config/collection.json | 4 +- 9 files changed, 39 insertions(+), 129 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java index 6f2d4bb580d..41ed8c50869 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java @@ -1,27 +1,18 @@ package edu.harvard.iq.dataverse; -import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import jakarta.json.Json; import jakarta.json.JsonObject; import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.AdditionalMatchers; -import org.mockito.Mockito; -import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; -import java.io.IOException; import java.io.StringReader; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; -import java.util.logging.ConsoleHandler; -import java.util.logging.Level; -import java.util.logging.Logger; +import java.util.Map; import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; @@ -30,14 +21,9 @@ public class DatasetFieldServiceBeanDansTest { private DatasetFieldServiceBean datasetFieldServiceBean; - static String getCvocJson(String pathToJsonFile) throws IOException { - final File datasetVersionJson = new File(pathToJsonFile); - return new String(Files.readAllBytes(Paths.get(datasetVersionJson.getAbsolutePath()))); - } - @BeforeEach void setUp() { - this.datasetFieldServiceBean = Mockito.spy(new DatasetFieldServiceBean()); + this.datasetFieldServiceBean = new DatasetFieldServiceBean(); // Logger rootLogger = Logger.getLogger(DatasetFieldServiceBean.class.getCanonicalName()); // rootLogger.setLevel(Level.FINE); @@ -77,9 +63,9 @@ void interceptedResultForAudience() { // TODO remove when assertTermNameValues s "vocabularyUri": "https://www.narcis.nl/classification/" } """)).readObject(); - List expectedValues = List.of( - "Exploitation and management of the physical environment", - "Exploitatie en beheer van het fysieke milieu" + Map expectedValues = Map.of( + "en", "Exploitation and management of the physical environment", + "nl", "Exploitatie en beheer van het fysieke milieu" ); assertThat(result.getString("@id")).isEqualTo("https://www.narcis.nl/classification/D18100"); assertTermNameValues(result, expectedValues); @@ -88,16 +74,16 @@ void interceptedResultForAudience() { // TODO remove when assertTermNameValues s } @Test - void getIndexableStringsForAudience() throws Exception { - String termURI = "https://www.narcis.nl/classification/D18100"; - JsonObject cvocEntry = createMocks("dansAudience", termURI, "audience.json"); + void filterResponseForAudience() throws Exception { + String termURI = "https://www.narcis.nl/classification/D13700"; + JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/audience.json"); JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/audience.json"); - JsonObject result = (JsonObject) reflectFilterResponse().invoke(datasetFieldServiceBean, cvocEntry, readObject, termURI); + JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); - List expectedValues = List.of( - "Exploitation and management of the physical environment", - "Exploitatie en beheer van het fysieke milieu" + Map expectedValues = Map.of( + "en", "Theoretical chemistry, quantum chemistry", + "nl", "Theoretische chemie, kwantumchemie" ); assertThat(result.getString("@id")).isEqualTo(termURI); assertTermNameValues(result, expectedValues); @@ -105,35 +91,38 @@ void getIndexableStringsForAudience() throws Exception { } @Test - void getIndexableStringsForAbrPeriod() throws Exception { + void filterResponseForAbrPeriod() throws Exception { String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/19679187-0ac4-4127-b4cd-09a348400585"; - JsonObject cvocEntry = createMocks("dansAbrPeriod", termURI, "abrPeriod.json"); + JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/abrPeriod.json"); JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/abrPeriod.json"); - JsonObject result = (JsonObject) reflectFilterResponse().invoke(datasetFieldServiceBean, cvocEntry, readObject, termURI); + JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); - List expectedValues = List.of( - "Vroege Middeleeuwen D" + Map expectedValues = Map.of( + "nl", "Vroege Middeleeuwen D" ); assertThat(result.getString("@id")).isEqualTo(termURI); assertTermNameValues(result, expectedValues); assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri"); } - private void assertTermNameValues(JsonObject result, List expectedValues) { + private void assertTermNameValues(JsonObject result, Map expectedValues) { assertThat(termNameValues(result)) .withFailMessage("Expected result with termName values: %s but got: %s", expectedValues, result) - .containsExactlyInAnyOrderElementsOf(expectedValues); + .containsExactlyInAnyOrderEntriesOf(expectedValues); } - private @NotNull List termNameValues(JsonObject result) { + private Map termNameValues(JsonObject result) { var termName = result.getJsonArray("termName"); if (termName == null) { - return List.of(); + return Map.of(); } return termName.stream() - .map(jsonValue -> ((JsonObject) jsonValue).getString("value")) - .collect(Collectors.toList()); + .map(jsonValue -> (JsonObject) jsonValue) + .collect(Collectors.toMap( + jsonObject -> jsonObject.getString("lang"), + jsonObject -> jsonObject.getString("value") + )); } private JsonObject readObject(String pathname) throws FileNotFoundException { @@ -141,35 +130,9 @@ private JsonObject readObject(String pathname) throws FileNotFoundException { return Json.createReader(reader).readObject(); } - private @NotNull Method reflectFilterResponse() throws NoSuchMethodException { + private @NotNull JsonObject callFilterResponse(JsonObject cvocEntry, JsonObject readObject, String termURI) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { Method filterResponseMethod = DatasetFieldServiceBean.class.getDeclaredMethod("filterResponse", JsonObject.class, JsonObject.class, String.class); filterResponseMethod.setAccessible(true); - return filterResponseMethod; - } - - /** - * Prepare unit tests with mock methods. - * - * @param fieldName "field-termUri" into cvoc configuration file - * @param termURI - * @param jsonFileName name of the JSON configuration/value files in: src/test/resources/json/cvoc-dans-config/ respectively src/test/resources/json/cvoc-dans-value/ - * @return {@link JsonObject} representing the configuration file - * @throws IOException in case on read error on one of the files file - */ - JsonObject createMocks(String fieldName, String termURI, String jsonFileName) throws IOException { - Long dftId = Long.parseLong("1"); - // DatasetFieldType termUri corresponding to "field-termUri" into cvoc configuration file - DatasetFieldType dft = new DatasetFieldType(fieldName, DatasetFieldType.FieldType.NONE, true); - dft.setId(dftId); - - Mockito.doReturn(dft).when(datasetFieldServiceBean).findByNameOpt(fieldName); - Mockito.doReturn(null).when(datasetFieldServiceBean).findByNameOpt(AdditionalMatchers.not(Mockito.eq(fieldName))); - - SettingsServiceBean settingsService = Mockito.mock(SettingsServiceBean.class); - fieldName = getCvocJson("src/test/resources/json/cvoc-dans-config/" + jsonFileName); - Mockito.when(settingsService.getValueForKey(SettingsServiceBean.Key.CVocConf)).thenReturn(fieldName); - datasetFieldServiceBean.settingsService = settingsService; - - return datasetFieldServiceBean.getCVocConf(false).get(dftId); + return (JsonObject) filterResponseMethod.invoke(datasetFieldServiceBean, cvocEntry, readObject, termURI); } } diff --git a/src/test/resources/json/cvoc-dans-config/AATClassification.json b/src/test/resources/json/cvoc-dans-config/AATClassification.json index 641c467460c..e0d11d39b00 100644 --- a/src/test/resources/json/cvoc-dans-config/AATClassification.json +++ b/src/test/resources/json/cvoc-dans-config/AATClassification.json @@ -1,5 +1,4 @@ -[ - { +{ "field-name": "dansAATClassification", "term-uri-field": "dansAATClassification", "cvoc-url": "https://dev.vocabs.datastations.nl/", @@ -49,44 +48,4 @@ ] } } - }, - { - "field-name": "authorAffiliation", - "term-uri-field": "authorAffiliation", - "js-url": [ - "/custom/ror.js", - "/custom/cvocutils.js" - ], - "protocol": "ror", - "retrieval-uri": "https://api.ror.org/organizations/{0}", - "allow-free-text": true, - "prefix": "https://ror.org/", - "managed-fields": {}, - "languages": "", - "vocabs": { - "rors": { - "uriSpace": "https://ror.org/" - } - }, - "retrieval-filtering": { - "@context": { - "termName": "https://schema.org/name", - "scheme": "http://www.w3.org/2004/02/skos/core#inScheme", - "lang": "@language", - "content": "@value" - }, - "scheme": { - "pattern": "http://www.grid.ac/ontology/" - }, - "termName": { - "pattern": "{0}", - "params": [ - "/name" - ] - }, - "@type": { - "pattern": "https://schema.org/Organization" - } - } } -] diff --git a/src/test/resources/json/cvoc-dans-config/abrArtifact.json b/src/test/resources/json/cvoc-dans-config/abrArtifact.json index a49066dd8d2..590f8cc5ccc 100644 --- a/src/test/resources/json/cvoc-dans-config/abrArtifact.json +++ b/src/test/resources/json/cvoc-dans-config/abrArtifact.json @@ -1,5 +1,4 @@ -[ - { +{ "field-name": "dansAbrArtifact", "term-uri-field": "dansAbrArtifact", "cvoc-url": "https://dev.vocabs.datastations.nl/", @@ -50,4 +49,4 @@ } } } -] + diff --git a/src/test/resources/json/cvoc-dans-config/abrComplex.json b/src/test/resources/json/cvoc-dans-config/abrComplex.json index c6b826d2719..8a5caacc18d 100644 --- a/src/test/resources/json/cvoc-dans-config/abrComplex.json +++ b/src/test/resources/json/cvoc-dans-config/abrComplex.json @@ -1,5 +1,4 @@ -[ - { +{ "field-name": "dansAbrComplex", "term-uri-field": "dansAbrComplex", "cvoc-url": "https://dev.vocabs.datastations.nl/", @@ -50,4 +49,3 @@ } } } -] diff --git a/src/test/resources/json/cvoc-dans-config/abrPeriod.json b/src/test/resources/json/cvoc-dans-config/abrPeriod.json index 086bcbe9d54..e67674bce86 100644 --- a/src/test/resources/json/cvoc-dans-config/abrPeriod.json +++ b/src/test/resources/json/cvoc-dans-config/abrPeriod.json @@ -1,5 +1,4 @@ -[ - { +{ "field-name": "dansAbrPeriod", "term-uri-field": "dansAbrPeriod", "cvoc-url": "https://dev.vocabs.datastations.nl/", @@ -50,4 +49,4 @@ } } } -] + diff --git a/src/test/resources/json/cvoc-dans-config/abrRapportType.json b/src/test/resources/json/cvoc-dans-config/abrRapportType.json index 3c6c40fced1..d370c099f27 100644 --- a/src/test/resources/json/cvoc-dans-config/abrRapportType.json +++ b/src/test/resources/json/cvoc-dans-config/abrRapportType.json @@ -1,5 +1,4 @@ -[ - { +{ "field-name": "dansAbrRapportType", "term-uri-field": "dansAbrRapportType", "cvoc-url": "https://dev.vocabs.datastations.nl/", @@ -50,4 +49,3 @@ } } } -] diff --git a/src/test/resources/json/cvoc-dans-config/abrVerwervingswijze.json b/src/test/resources/json/cvoc-dans-config/abrVerwervingswijze.json index 79b6fa179d9..18cb5d59ffc 100644 --- a/src/test/resources/json/cvoc-dans-config/abrVerwervingswijze.json +++ b/src/test/resources/json/cvoc-dans-config/abrVerwervingswijze.json @@ -1,5 +1,4 @@ -[ - { +{ "field-name": "dansAbrVerwervingswijze", "term-uri-field": "dansAbrVerwervingswijze", "cvoc-url": "https://dev.vocabs.datastations.nl/", @@ -50,4 +49,3 @@ } } } -] diff --git a/src/test/resources/json/cvoc-dans-config/audience.json b/src/test/resources/json/cvoc-dans-config/audience.json index 26db1d38711..64ea6a2525b 100644 --- a/src/test/resources/json/cvoc-dans-config/audience.json +++ b/src/test/resources/json/cvoc-dans-config/audience.json @@ -1,5 +1,4 @@ -[ - { +{ "field-name": "dansAudience", "term-uri-field": "dansAudience", "cvoc-url": "https://dev.vocabs.datastations.nl/", @@ -50,4 +49,3 @@ } } } -] diff --git a/src/test/resources/json/cvoc-dans-config/collection.json b/src/test/resources/json/cvoc-dans-config/collection.json index 798b93cd646..3a7ea5fd2f4 100644 --- a/src/test/resources/json/cvoc-dans-config/collection.json +++ b/src/test/resources/json/cvoc-dans-config/collection.json @@ -1,5 +1,4 @@ -[ - { +{ "field-name": "dansCollection", "term-uri-field": "dansCollection", "cvoc-url": "https://dev.vocabs.datastations.nl/", @@ -50,4 +49,3 @@ } } } -] From 8473a0bc3a251afb3c900218a53a077143bb7314 Mon Sep 17 00:00:00 2001 From: jo-pol Date: Tue, 29 Apr 2025 12:17:24 +0200 Subject: [PATCH 020/470] vocabularyName is returned --- .../harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java index 41ed8c50869..816f9a30397 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java @@ -69,8 +69,7 @@ void interceptedResultForAudience() { // TODO remove when assertTermNameValues s ); assertThat(result.getString("@id")).isEqualTo("https://www.narcis.nl/classification/D18100"); assertTermNameValues(result, expectedValues); - assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri"); - // TODO shouldn't we also get the vocabularyName? + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } @Test From 171697e951e567ee2e7515c5425e184b1c0f7293 Mon Sep 17 00:00:00 2001 From: jo-pol Date: Tue, 29 Apr 2025 13:16:42 +0200 Subject: [PATCH 021/470] reverted NPE preventions --- .../iq/dataverse/DatasetFieldServiceBean.java | 88 +++++++------------ 1 file changed, 30 insertions(+), 58 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java index ac98db818e5..4142ea5c3bf 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java @@ -649,7 +649,6 @@ private JsonObject filterResponse(JsonObject cvocEntry, JsonObject readObject, S logger.fine("RF: " + filtering.toString()); JsonObject managedFields = cvocEntry.getJsonObject("managed-fields"); logger.fine("MF: " + managedFields.toString()); - int nrOfNotFound = 0; for (String filterKey : filtering.keySet()) { if (!filterKey.equals("@context")) { try { @@ -668,14 +667,9 @@ private JsonObject filterResponse(JsonObject cvocEntry, JsonObject readObject, S param = param.substring(1); String[] pathParts = param.split("/"); logger.fine("PP: " + String.join(", ", pathParts)); - var foundPart = processPathSegment(0, pathParts, readObject, termUri); - if (foundPart == null) { - nrOfNotFound ++ ; - logger.warning("External Vocabulary: no value found for %s - %s".formatted(filterKey, param)); - } else { - vals.add(i, foundPart); - logger.fine("Added param value: " + i + ": " + vals.get(i)); - } + JsonValue curPath = readObject; + vals.add(i, processPathSegment(0, pathParts, curPath, termUri)); + logger.fine("Added param value: " + i + ": " + vals.get(i)); } else { logger.fine("Param is: " + param); // param is not a path - either a reference to the term URI @@ -698,29 +692,19 @@ private JsonObject filterResponse(JsonObject cvocEntry, JsonObject readObject, S logger.fine("Added #id pattern: " + filterKey + ": " + termUri); job.add(filterKey, termUri); } else if (pattern.contains("{")) { - if (vals.isEmpty()) { - if (nrOfNotFound == 0) { - logger.warning("External Vocabulary: " + termUri + " - No value found for " + filterKey); - } - } - else { - if (pattern.equals("{0}")) { - if (vals.get(0) instanceof JsonArray) { - job.add(filterKey, (JsonArray) vals.get(0)); - } - else if (vals.get(0) instanceof JsonObject) { - job.add(filterKey, (JsonObject) vals.get(0)); - } - else { - job.add(filterKey, (String) vals.get(0)); - } - } - else { - String result = MessageFormat.format(pattern, vals.toArray()); - logger.fine("Result: " + result); - job.add(filterKey, result); - logger.fine("Added : " + filterKey + ": " + result); + if (pattern.equals("{0}")) { + if (vals.get(0) instanceof JsonArray) { + job.add(filterKey, (JsonArray) vals.get(0)); + } else if (vals.get(0) instanceof JsonObject) { + job.add(filterKey, (JsonObject) vals.get(0)); + } else { + job.add(filterKey, (String) vals.get(0)); } + } else { + String result = MessageFormat.format(pattern, vals.toArray()); + logger.fine("Result: " + result); + job.add(filterKey, result); + logger.fine("Added : " + filterKey + ": " + result); } } else { logger.fine("Added hardcoded pattern: " + filterKey + ": " + pattern); @@ -733,9 +717,6 @@ else if (vals.get(0) instanceof JsonObject) { } } } - if(nrOfNotFound>0) { - logger.warning("External Vocabulary: " + termUri + " - Failed to find value(s) reported above in " +readObject); - } JsonObject filteredResponse = job.build(); if(filteredResponse.isEmpty()) { logger.severe("Unable to filter response for term: " + termUri + ", received: " + readObject.toString()); @@ -758,20 +739,15 @@ Object processPathSegment(int index, String[] pathParts, JsonValue curPath, Stri if (expected.equals("@id")) { expected = termUri; } - if (arr != null) { - for (int k = 0; k < arr.size(); k++) { - JsonObject jo = arr.getJsonObject(k); - if (!jo.isEmpty()) { - JsonValue val = jo.get(keyVal[0]); - if (val != null && val.getValueType() == ValueType.STRING && val.toString().equals(expected)) { - logger.fine("Found: " + jo.toString()); - curPath = jo; - return processPathSegment(index + 1, pathParts, curPath, termUri); - } - } + for (int k = 0; k < arr.size(); k++) { + JsonObject jo = arr.getJsonObject(k); + String val = jo.getString(keyVal[0]); + if (val.equals(expected)) { + logger.fine("Found: " + jo.toString()); + curPath = jo; + return processPathSegment(index + 1, pathParts, curPath, termUri); } } - return null; } else { JsonArrayBuilder parts = Json.createArrayBuilder(); for (JsonValue subPath : arr) { @@ -790,24 +766,20 @@ Object processPathSegment(int index, String[] pathParts, JsonValue curPath, Stri } else { curPath = ((JsonObject) curPath).get(pathParts[index]); - logger.fine("Found next Path object " + curPath); + logger.fine("Found next Path object " + curPath.toString()); return processPathSegment(index + 1, pathParts, curPath, termUri); } } else { logger.fine("Last segment: " + curPath.toString()); logger.fine("Looking for : " + pathParts[index]); JsonValue jv = ((JsonObject) curPath).get(pathParts[index]); - if (jv != null) { - ValueType type = jv.getValueType(); - if (type.equals(ValueType.STRING)) { - return ((JsonString) jv).getString(); - } - else if (jv.getValueType().equals(ValueType.ARRAY)) { - return jv; - } - else if (jv.getValueType().equals(ValueType.OBJECT)) { - return jv; - } + ValueType type =jv.getValueType(); + if (type.equals(JsonValue.ValueType.STRING)) { + return ((JsonString) jv).getString(); + } else if (jv.getValueType().equals(JsonValue.ValueType.ARRAY)) { + return jv; + } else if (jv.getValueType().equals(JsonValue.ValueType.OBJECT)) { + return jv; } } From 801575f266ee80ed3417fa4d367391d8230e6153 Mon Sep 17 00:00:00 2001 From: jo-pol Date: Tue, 29 Apr 2025 14:08:24 +0200 Subject: [PATCH 022/470] fix test for single language termName --- .../DatasetFieldServiceBeanDansTest.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java index 816f9a30397..eca11b9139d 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java @@ -1,6 +1,7 @@ package edu.harvard.iq.dataverse; import jakarta.json.Json; +import jakarta.json.JsonArray; import jakarta.json.JsonObject; import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.AfterEach; @@ -69,7 +70,7 @@ void interceptedResultForAudience() { // TODO remove when assertTermNameValues s ); assertThat(result.getString("@id")).isEqualTo("https://www.narcis.nl/classification/D18100"); assertTermNameValues(result, expectedValues); - assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri"); } @Test @@ -86,12 +87,12 @@ void filterResponseForAudience() throws Exception { ); assertThat(result.getString("@id")).isEqualTo(termURI); assertTermNameValues(result, expectedValues); - assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri"); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } @Test void filterResponseForAbrPeriod() throws Exception { - String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/19679187-0ac4-4127-b4cd-09a348400585"; + String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f"; JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/abrPeriod.json"); JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/abrPeriod.json"); @@ -102,7 +103,7 @@ void filterResponseForAbrPeriod() throws Exception { ); assertThat(result.getString("@id")).isEqualTo(termURI); assertTermNameValues(result, expectedValues); - assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri"); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName"); } private void assertTermNameValues(JsonObject result, Map expectedValues) { @@ -112,16 +113,21 @@ private void assertTermNameValues(JsonObject result, Map expecte } private Map termNameValues(JsonObject result) { - var termName = result.getJsonArray("termName"); + var termName = result.get("termName"); if (termName == null) { return Map.of(); } - return termName.stream() - .map(jsonValue -> (JsonObject) jsonValue) - .collect(Collectors.toMap( - jsonObject -> jsonObject.getString("lang"), - jsonObject -> jsonObject.getString("value") - )); + if(termName instanceof JsonArray) { + return ((JsonArray) termName).stream() + .map(jsonValue -> (JsonObject) jsonValue) + .collect(Collectors.toMap( + jsonObject -> jsonObject.getString("lang"), + jsonObject -> jsonObject.getString("value") + )); + } else { + var tn = (JsonObject) termName; + return Map.of(tn.getString("lang"), tn.getString("value")); + } } private JsonObject readObject(String pathname) throws FileNotFoundException { From 5e59050a492ba2641e63a441d962ffe63ba05925 Mon Sep 17 00:00:00 2001 From: jo-pol Date: Tue, 29 Apr 2025 14:22:38 +0200 Subject: [PATCH 023/470] restored NPE preventions in a way that does not hurt the valid cases --- .../iq/dataverse/DatasetFieldServiceBean.java | 87 ++++++++++++------- 1 file changed, 57 insertions(+), 30 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java index 4142ea5c3bf..3136a8187bf 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java @@ -649,6 +649,7 @@ private JsonObject filterResponse(JsonObject cvocEntry, JsonObject readObject, S logger.fine("RF: " + filtering.toString()); JsonObject managedFields = cvocEntry.getJsonObject("managed-fields"); logger.fine("MF: " + managedFields.toString()); + int nrOfNotFound = 0; for (String filterKey : filtering.keySet()) { if (!filterKey.equals("@context")) { try { @@ -667,9 +668,14 @@ private JsonObject filterResponse(JsonObject cvocEntry, JsonObject readObject, S param = param.substring(1); String[] pathParts = param.split("/"); logger.fine("PP: " + String.join(", ", pathParts)); - JsonValue curPath = readObject; - vals.add(i, processPathSegment(0, pathParts, curPath, termUri)); - logger.fine("Added param value: " + i + ": " + vals.get(i)); + var foundPart = processPathSegment(0, pathParts, readObject, termUri); + if (foundPart == null) { + nrOfNotFound ++ ; + logger.warning("External Vocabulary: no value found for %s - %s".formatted(filterKey, param)); + } else { + vals.add(i, foundPart); + logger.fine("Added param value: " + i + ": " + vals.get(i)); + } } else { logger.fine("Param is: " + param); // param is not a path - either a reference to the term URI @@ -692,19 +698,29 @@ private JsonObject filterResponse(JsonObject cvocEntry, JsonObject readObject, S logger.fine("Added #id pattern: " + filterKey + ": " + termUri); job.add(filterKey, termUri); } else if (pattern.contains("{")) { - if (pattern.equals("{0}")) { - if (vals.get(0) instanceof JsonArray) { - job.add(filterKey, (JsonArray) vals.get(0)); - } else if (vals.get(0) instanceof JsonObject) { - job.add(filterKey, (JsonObject) vals.get(0)); - } else { - job.add(filterKey, (String) vals.get(0)); + if (vals.isEmpty()) { + if (nrOfNotFound == 0) { + logger.warning("External Vocabulary: " + termUri + " - No value found for " + filterKey); + } + } + else { + if (pattern.equals("{0}")) { + if (vals.get(0) instanceof JsonArray) { + job.add(filterKey, (JsonArray) vals.get(0)); + } + else if (vals.get(0) instanceof JsonObject) { + job.add(filterKey, (JsonObject) vals.get(0)); + } + else { + job.add(filterKey, (String) vals.get(0)); + } + } + else { + String result = MessageFormat.format(pattern, vals.toArray()); + logger.fine("Result: " + result); + job.add(filterKey, result); + logger.fine("Added : " + filterKey + ": " + result); } - } else { - String result = MessageFormat.format(pattern, vals.toArray()); - logger.fine("Result: " + result); - job.add(filterKey, result); - logger.fine("Added : " + filterKey + ": " + result); } } else { logger.fine("Added hardcoded pattern: " + filterKey + ": " + pattern); @@ -717,6 +733,9 @@ private JsonObject filterResponse(JsonObject cvocEntry, JsonObject readObject, S } } } + if(nrOfNotFound>0) { + logger.warning("External Vocabulary: " + termUri + " - Failed to find value(s) reported above in " +readObject); + } JsonObject filteredResponse = job.build(); if(filteredResponse.isEmpty()) { logger.severe("Unable to filter response for term: " + termUri + ", received: " + readObject.toString()); @@ -739,13 +758,17 @@ Object processPathSegment(int index, String[] pathParts, JsonValue curPath, Stri if (expected.equals("@id")) { expected = termUri; } - for (int k = 0; k < arr.size(); k++) { - JsonObject jo = arr.getJsonObject(k); - String val = jo.getString(keyVal[0]); - if (val.equals(expected)) { - logger.fine("Found: " + jo.toString()); - curPath = jo; - return processPathSegment(index + 1, pathParts, curPath, termUri); + if (arr != null) { + for (int k = 0; k < arr.size(); k++) { + JsonObject jo = arr.getJsonObject(k); + if (jo!=null) { + String val = jo.getString(keyVal[0]); + if (val != null && val.equals(expected)) { + logger.fine("Found: " + jo.toString()); + curPath = jo; + return processPathSegment(index + 1, pathParts, curPath, termUri); + } + } } } } else { @@ -766,20 +789,24 @@ Object processPathSegment(int index, String[] pathParts, JsonValue curPath, Stri } else { curPath = ((JsonObject) curPath).get(pathParts[index]); - logger.fine("Found next Path object " + curPath.toString()); + logger.fine("Found next Path object " + curPath); return processPathSegment(index + 1, pathParts, curPath, termUri); } } else { logger.fine("Last segment: " + curPath.toString()); logger.fine("Looking for : " + pathParts[index]); JsonValue jv = ((JsonObject) curPath).get(pathParts[index]); - ValueType type =jv.getValueType(); - if (type.equals(JsonValue.ValueType.STRING)) { - return ((JsonString) jv).getString(); - } else if (jv.getValueType().equals(JsonValue.ValueType.ARRAY)) { - return jv; - } else if (jv.getValueType().equals(JsonValue.ValueType.OBJECT)) { - return jv; + if (jv != null) { + ValueType type = jv.getValueType(); + if (type.equals(ValueType.STRING)) { + return ((JsonString) jv).getString(); + } + else if (jv.getValueType().equals(ValueType.ARRAY)) { + return jv; + } + else if (jv.getValueType().equals(ValueType.OBJECT)) { + return jv; + } } } From 90e53c353ed05ced607e1d7fb657e96b8ce07dab Mon Sep 17 00:00:00 2001 From: jo-pol Date: Tue, 29 Apr 2025 14:46:44 +0200 Subject: [PATCH 024/470] cleanup --- .../DatasetFieldServiceBeanDansTest.java | 29 ++----------------- .../json/cvoc-dans-config/collection.json | 2 +- 2 files changed, 3 insertions(+), 28 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java index eca11b9139d..cdbbee863b6 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java @@ -46,33 +46,6 @@ void tearDown() { this.datasetFieldServiceBean = null; } - @Test - void interceptedResultForAudience() { // TODO remove when assertTermNameValues succeeds in another test - JsonObject result = Json.createReader(new StringReader(""" - { - "@id": "https://www.narcis.nl/classification/D18100", - "termName": [ - { - "lang": "nl", - "value": "Exploitatie en beheer van het fysieke milieu" - }, - { - "lang": "en", - "value": "Exploitation and management of the physical environment" - } - ], - "vocabularyUri": "https://www.narcis.nl/classification/" - } - """)).readObject(); - Map expectedValues = Map.of( - "en", "Exploitation and management of the physical environment", - "nl", "Exploitatie en beheer van het fysieke milieu" - ); - assertThat(result.getString("@id")).isEqualTo("https://www.narcis.nl/classification/D18100"); - assertTermNameValues(result, expectedValues); - assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri"); - } - @Test void filterResponseForAudience() throws Exception { String termURI = "https://www.narcis.nl/classification/D13700"; @@ -130,6 +103,8 @@ private Map termNameValues(JsonObject result) { } } + // TODO add more tests for other CVOC entries + private JsonObject readObject(String pathname) throws FileNotFoundException { var reader = new FileReader(pathname); return Json.createReader(reader).readObject(); diff --git a/src/test/resources/json/cvoc-dans-config/collection.json b/src/test/resources/json/cvoc-dans-config/collection.json index 3a7ea5fd2f4..d1059bf0a10 100644 --- a/src/test/resources/json/cvoc-dans-config/collection.json +++ b/src/test/resources/json/cvoc-dans-config/collection.json @@ -38,7 +38,7 @@ "vocabularyName": { "pattern": "{0}", "params": [ - "/graph/type=skos:ConceptScheme/label" + "/graph/type=skos:ConceptScheme/prefLabel" ] }, "vocabularyUri": { From f3f7656ca0303004b814a7e6697b7b51074b4337 Mon Sep 17 00:00:00 2001 From: jo-pol Date: Tue, 29 Apr 2025 15:57:15 +0200 Subject: [PATCH 025/470] class cast exception --- .../iq/dataverse/DatasetFieldServiceBean.java | 16 +++-- ...etFieldServiceBeanFilterResponseTest.java} | 71 +++++++++++++++++-- 2 files changed, 78 insertions(+), 9 deletions(-) rename src/test/java/edu/harvard/iq/dataverse/{DatasetFieldServiceBeanDansTest.java => DatasetFieldServiceBeanFilterResponseTest.java} (58%) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java index 3136a8187bf..1afc738a428 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java @@ -762,11 +762,17 @@ Object processPathSegment(int index, String[] pathParts, JsonValue curPath, Stri for (int k = 0; k < arr.size(); k++) { JsonObject jo = arr.getJsonObject(k); if (jo!=null) { - String val = jo.getString(keyVal[0]); - if (val != null && val.equals(expected)) { - logger.fine("Found: " + jo.toString()); - curPath = jo; - return processPathSegment(index + 1, pathParts, curPath, termUri); + JsonValue val = jo.get(keyVal[0]); + if (val != null) { + if (val.getValueType().equals(ValueType.STRING)) { + if (((JsonString) val).getString().equals(expected)) { + logger.fine("Found: " + jo); + curPath = jo; + return processPathSegment(index + 1, pathParts, curPath, termUri); + } + } else { + logger.warning("Expected a string value for " + keyVal[0] + " but found: " + val.getValueType()); + } } } } diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java similarity index 58% rename from src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java rename to src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java index cdbbee863b6..ead20657b68 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanDansTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java @@ -10,7 +10,6 @@ import java.io.FileNotFoundException; import java.io.FileReader; -import java.io.StringReader; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Map; @@ -18,7 +17,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class DatasetFieldServiceBeanDansTest { +public class DatasetFieldServiceBeanFilterResponseTest { private DatasetFieldServiceBean datasetFieldServiceBean; @@ -47,7 +46,7 @@ void tearDown() { } @Test - void filterResponseForAudience() throws Exception { + void audience() throws Exception { String termURI = "https://www.narcis.nl/classification/D13700"; JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/audience.json"); JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/audience.json"); @@ -64,7 +63,7 @@ void filterResponseForAudience() throws Exception { } @Test - void filterResponseForAbrPeriod() throws Exception { + void abrPeriod() throws Exception { String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f"; JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/abrPeriod.json"); JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/abrPeriod.json"); @@ -79,6 +78,70 @@ void filterResponseForAbrPeriod() throws Exception { assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName"); } + @Test + void abrArtifact() throws Exception { + String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/db8feb21-8ddc-432f-8062-a3a15f7f7cf4"; + JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/abrArtifact.json"); + JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/abrArtifact.json"); + + JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); + + Map expectedValues = Map.of( + "nl", "steen" + ); + assertThat(result.getString("@id")).isEqualTo(termURI); + assertTermNameValues(result, expectedValues); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName"); + } + + @Test + void abrVerwervingswijze() throws Exception { + String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/b7f4fe13-d7b4-4fb9-a7a8-c25ef74b612d"; + JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/abrVerwervingswijze.json"); + JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/abrVerwervingswijze.json"); + + JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); + + Map expectedValues = Map.of( + "nl", "archeologisch: booronderzoek" + ); + assertThat(result.getString("@id")).isEqualTo(termURI); + assertTermNameValues(result, expectedValues); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName"); + } + + @Test + void abrRapportType() throws Exception { + String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/5701cb3d-0ffd-4663-98e0-fab808448109"; + JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/abrRapportType.json"); + JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/abrRapportType.json"); + + JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); + + Map expectedValues = Map.of( + "nl", "Achterhoekse Archeologische Publicaties" + ); + assertThat(result.getString("@id")).isEqualTo(termURI); + assertTermNameValues(result, expectedValues); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName"); + } + + @Test + void abrComplex() throws Exception { + String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/1b5b4dd1-f4f8-4e4c-9108-a6fb2c606cde"; + JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/abrComplex.json"); + JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/abrComplex.json"); + + JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); + + Map expectedValues = Map.of( + "nl", "(ring)walburg" + ); + assertThat(result.getString("@id")).isEqualTo(termURI); + assertTermNameValues(result, expectedValues); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName"); + } + private void assertTermNameValues(JsonObject result, Map expectedValues) { assertThat(termNameValues(result)) .withFailMessage("Expected result with termName values: %s but got: %s", expectedValues, result) From eaf49a99bd234cddffe280090781133bbfca50ba Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Tue, 29 Apr 2025 14:50:11 -0400 Subject: [PATCH 026/470] refactor so both datafiles and datasets validate update timestamp the same way --- .../11243-editmetadata-api-extension.md | 4 +++- doc/sphinx-guides/source/api/native-api.rst | 12 ++++++------ .../iq/dataverse/api/AbstractApiBean.java | 18 +++++++----------- .../edu/harvard/iq/dataverse/api/Datasets.java | 8 +++++--- .../edu/harvard/iq/dataverse/api/Files.java | 5 ++--- src/main/java/propertyFiles/Bundle.properties | 3 +-- .../harvard/iq/dataverse/api/DatasetsIT.java | 15 ++++++++------- .../edu/harvard/iq/dataverse/api/FilesIT.java | 2 +- .../edu/harvard/iq/dataverse/api/UtilIT.java | 4 ++-- 9 files changed, 35 insertions(+), 36 deletions(-) diff --git a/doc/release-notes/11243-editmetadata-api-extension.md b/doc/release-notes/11243-editmetadata-api-extension.md index 6f5a2af283b..4aaf9320074 100644 --- a/doc/release-notes/11243-editmetadata-api-extension.md +++ b/doc/release-notes/11243-editmetadata-api-extension.md @@ -1,5 +1,7 @@ ### Edit Dataset Metadata API extension - This endpoint now allows removing fields (by sending empty values), as long as they are not required by the dataset. -- New ``sourceInternalVersionNumber`` optional query parameter, which prevents inconsistencies by managing updates that +- New ``sourceInternalVersionTimestamp`` optional query parameter, which prevents inconsistencies by managing updates that may occur from other users while a dataset is being edited. + +NOTE: This release note was updated to conform to the refactoring of the validation as part of issue #11392 diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index a27b7ae3269..352234d844a 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -2137,26 +2137,26 @@ For these edits your JSON file need only include those dataset fields which you This endpoint also allows removing fields, as long as they are not required by the dataset. To remove a field, send an empty value (``""``) for individual fields. For multiple fields, send an empty array (``[]``). A sample JSON file for removing fields may be downloaded here: :download:`dataset-edit-metadata-delete-fields-sample.json <../_static/api/dataset-edit-metadata-delete-fields-sample.json>` -If another user updates the dataset version metadata before you send the update request, data inconsistencies may occur. To prevent this, you can use the optional ``sourceInternalVersionNumber`` query parameter. This parameter must include the internal version number corresponding to the dataset version being updated. Note that internal version numbers increase sequentially with each version update. +If another user updates the dataset version metadata before you send the update request, data inconsistencies may occur. To prevent this, you can use the optional ``sourceInternalVersionTimestamp`` query parameter. This parameter must include the ``lastUpdateTime`` corresponding to the dataset version being updated. The date must be in this format "yyyy-MM-dd'T'HH:mm:ss'Z'" -If this parameter is provided, the update will proceed only if the internal version number remains unchanged. Otherwise, the request will fail with an error. +If this parameter is provided, the update will proceed only if the ``lastUpdateTime`` remains unchanged. Otherwise, the request will fail with an error. -Example using ``sourceInternalVersionNumber``: +Example using ``sourceInternalVersionTimestamp``: .. code-block:: bash export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx export SERVER_URL=https://demo.dataverse.org export PERSISTENT_IDENTIFIER=doi:10.5072/FK2/BCCP9Z - export SOURCE_INTERNAL_VERSION_NUMBER=5 + export SOURCE_INTERNAL_VERSION_TIMESTAMP=2025-04-25T13:58:28Z - curl -H "X-Dataverse-key: $API_TOKEN" -X PUT "$SERVER_URL/api/datasets/:persistentId/editMetadata?persistentId=$PERSISTENT_IDENTIFIER&replace=true&sourceInternalVersionNumber=$SOURCE_INTERNAL_VERSION_NUMBER" --upload-file dataset-update-metadata.json + curl -H "X-Dataverse-key: $API_TOKEN" -X PUT "$SERVER_URL/api/datasets/:persistentId/editMetadata?persistentId=$PERSISTENT_IDENTIFIER&replace=true&sourceInternalVersionTimestamp=$SOURCE_INTERNAL_VERSION_TIMESTAMP" --upload-file dataset-update-metadata.json The fully expanded example above (without environment variables) looks like this: .. code-block:: bash - curl -H "X-Dataverse-key: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -X PUT "https://demo.dataverse.org/api/datasets/:persistentId/editMetadata/?persistentId=doi:10.5072/FK2/BCCP9Z&replace=true&sourceInternalVersionNumber=5" --upload-file dataset-update-metadata.json + curl -H "X-Dataverse-key: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -X PUT "https://demo.dataverse.org/api/datasets/:persistentId/editMetadata/?persistentId=doi:10.5072/FK2/BCCP9Z&replace=true&sourceInternalVersionTimestamp=2025-04-25T13:58:28Z" --upload-file dataset-update-metadata.json Delete Dataset Metadata diff --git a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java index 00dadb1cae4..c53f9f8119c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java @@ -445,15 +445,7 @@ public Command handleLatestPublished() { return dsv; } - protected void validateInternalVersionNumberIsNotOutdated(Dataset dataset, int internalVersion) throws WrappedResponse { - if (dataset.getLatestVersion().getVersion() > internalVersion) { - throw new WrappedResponse( - badRequest(BundleUtil.getStringFromBundle("abstractApiBean.error.datasetInternalVersionNumberIsOutdated", Collections.singletonList(Integer.toString(internalVersion)))) - ); - } - } - - protected void validateInternalTimestampIsNotOutdated(DataFile dataFile, String sourceInternalVersionTimestamp) throws WrappedResponse { + protected void validateInternalTimestampIsNotOutdated(DvObject dvObject, String sourceInternalVersionTimestamp) throws WrappedResponse { Date date = sourceInternalVersionTimestamp != null ? DateUtil.parseDate(sourceInternalVersionTimestamp, "yyyy-MM-dd'T'HH:mm:ss'Z'") : null; if (date == null) { throw new WrappedResponse( @@ -461,10 +453,14 @@ protected void validateInternalTimestampIsNotOutdated(DataFile dataFile, String ); } Instant instant = date.toInstant(); + Instant updateTimestamp = + (dvObject instanceof DataFile) ? ((DataFile) dvObject).getFileMetadata().getDatasetVersion().getLastUpdateTime().toInstant() : + (dvObject instanceof Dataset) ? ((Dataset) dvObject).getLatestVersion().getLastUpdateTime().toInstant() : + instant; // granularity is to the second since the json output only returns dates in this format to the second - if (dataFile.getFileMetadata().getDatasetVersion().getLastUpdateTime().toInstant().getEpochSecond() != instant.getEpochSecond()) { + if (updateTimestamp.getEpochSecond() != instant.getEpochSecond()) { throw new WrappedResponse( - badRequest(BundleUtil.getStringFromBundle("abstractApiBean.error.datafileInternalVersionTimestampIsOutdated", Collections.singletonList(sourceInternalVersionTimestamp))) + badRequest(BundleUtil.getStringFromBundle("abstractApiBean.error.internalVersionTimestampIsOutdated", Collections.singletonList(sourceInternalVersionTimestamp))) ); } } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index bf04cdd6226..e36b50ad0e0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -1093,12 +1093,14 @@ private String getCompoundDisplayValue (DatasetFieldCompoundValue dscv){ @PUT @AuthRequired @Path("{id}/editMetadata") - public Response editVersionMetadata(@Context ContainerRequestContext crc, String jsonBody, @PathParam("id") String id, @QueryParam("replace") boolean replaceData, @QueryParam("sourceInternalVersionNumber") Integer sourceInternalVersionNumber) { + public Response editVersionMetadata(@Context ContainerRequestContext crc, String jsonBody, @PathParam("id") String id, + @QueryParam("replace") boolean replaceData, + @QueryParam("sourceInternalVersionTimestamp") String sourceInternalVersionTimestamp) { try { Dataset dataset = findDatasetOrDie(id); - if (sourceInternalVersionNumber != null) { - validateInternalVersionNumberIsNotOutdated(dataset, sourceInternalVersionNumber); + if (sourceInternalVersionTimestamp != null) { + validateInternalTimestampIsNotOutdated(dataset, sourceInternalVersionTimestamp); } JsonObject json = JsonUtil.getJsonObject(jsonBody); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Files.java b/src/main/java/edu/harvard/iq/dataverse/api/Files.java index b38d5375f66..1b809894e17 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Files.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Files.java @@ -410,8 +410,7 @@ public Response deleteFileInDataset(@Context ContainerRequestContext crc, @PathP @AuthRequired @Path("{id}/metadata") public Response updateFileMetadata(@Context ContainerRequestContext crc, @FormDataParam("jsonData") String jsonData, - @PathParam("id") String fileIdOrPersistentId, @QueryParam("sourceInternalVersionTimestamp") String sourceInternalVersionTimestamp - ) throws CommandException { + @PathParam("id") String fileIdOrPersistentId, @QueryParam("sourceInternalVersionTimestamp") String sourceInternalVersionTimestamp) { FileMetadata upFmd = null; @@ -526,7 +525,7 @@ public Response updateFileMetadata(@Context ContainerRequestContext crc, @FormDa return error(Response.Status.INTERNAL_SERVER_ERROR, "Error adding metadata to DataFile: " + e); } - } catch (WrappedResponse wr) { + } catch (CommandException | WrappedResponse ex) { return error(BAD_REQUEST, "An error has occurred attempting to update the requested DataFile, likely related to permissions."); } diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index 1036e1a836c..3dae5a8ed15 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -3204,5 +3204,4 @@ datasetFieldValidator.error.emptyRequiredSingleValueForField=Empty required valu updateDatasetFieldsCommand.api.processDatasetUpdate.parseError=Error parsing dataset update: {0} #AbstractApiBean.java -abstractApiBean.error.datasetInternalVersionNumberIsOutdated=Dataset internal version number {0} is outdated -abstractApiBean.error.datafileInternalVersionTimestampIsOutdated=File Metadata internal version timestamp {0} is outdated +abstractApiBean.error.internalVersionTimestampIsOutdated=Internal version timestamp {0} is outdated diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java index b6ff3d9b401..13837bed859 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java @@ -671,25 +671,26 @@ public void testAddUpdateDatasetViaNativeAPI() { """; Response updateMetadataRemoveAlternativeTitles = UtilIT.editVersionMetadataFromJsonStr(datasetPersistentId, jsonString, apiToken); + updateMetadataRemoveAlternativeTitles.prettyPrint(); updateMetadataRemoveAlternativeTitles.then().assertThat() .body("data.metadataBlocks.citation.fields[2].typeName", not(equalTo("alternativeTitle"))) .statusCode(OK.getStatusCode()); - // Test sourceInternalVersionNumber optional query parameter - - Integer internalVersionNumber = updateMetadataRemoveAlternativeTitles.then().extract().path("data.internalVersionNumber"); - assertNotNull(internalVersionNumber); + // Test sourceInternalVersionTimestamp optional query parameter + String sourceInternalVersionTimestamp = updateMetadataRemoveAlternativeTitles.then().extract().path("data.lastUpdateTime"); + assertNotNull(sourceInternalVersionTimestamp); + String oldTimestamp = "2025-04-25T13:58:28Z"; // Case 1 - Pass outdated internal version number - Response updateMetadataWithOutdatedInternalVersionNumber = UtilIT.editVersionMetadataFromJsonStr(datasetPersistentId, jsonString, apiToken, internalVersionNumber - 1); + Response updateMetadataWithOutdatedInternalVersionNumber = UtilIT.editVersionMetadataFromJsonStr(datasetPersistentId, jsonString, apiToken, oldTimestamp); updateMetadataWithOutdatedInternalVersionNumber.then().assertThat() - .body("message", equalTo(BundleUtil.getStringFromBundle("abstractApiBean.error.datasetInternalVersionNumberIsOutdated", Collections.singletonList(Integer.toString(internalVersionNumber - 1))))) + .body("message", equalTo(BundleUtil.getStringFromBundle("abstractApiBean.error.internalVersionTimestampIsOutdated", Collections.singletonList(oldTimestamp)))) .statusCode(BAD_REQUEST.getStatusCode()); // Case 2 - Pass latest internal version number - Response updateMetadataWithLatestInternalVersionNumber = UtilIT.editVersionMetadataFromJsonStr(datasetPersistentId, jsonString, apiToken, internalVersionNumber); + Response updateMetadataWithLatestInternalVersionNumber = UtilIT.editVersionMetadataFromJsonStr(datasetPersistentId, jsonString, apiToken, sourceInternalVersionTimestamp); updateMetadataWithLatestInternalVersionNumber.then().assertThat() .statusCode(OK.getStatusCode()); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java index de45362ce98..f38ca34a283 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/FilesIT.java @@ -3280,7 +3280,7 @@ public void testUpdateWithEmptyFieldsAndVersionCheck() throws InterruptedExcepti updateResponse.prettyPrint(); updateResponse.then().assertThat() .body("status", equalTo(ApiConstants.STATUS_ERROR)) - .body("message", equalTo(BundleUtil.getStringFromBundle("abstractApiBean.error.datafileInternalVersionTimestampIsOutdated",Collections.singletonList(lastUpdateTime)))) + .body("message", equalTo(BundleUtil.getStringFromBundle("abstractApiBean.error.internalVersionTimestampIsOutdated",Collections.singletonList(lastUpdateTime)))) .statusCode(BAD_REQUEST.getStatusCode()); // Second user refreshes and updates. Should pass now diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index 04d0b27d63c..9d85903dde3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -771,7 +771,7 @@ static Response editVersionMetadataFromJsonStr(String persistentId, String jsonS return editVersionMetadataFromJsonStr(persistentId, jsonString, apiToken, null); } - static Response editVersionMetadataFromJsonStr(String persistentId, String jsonString, String apiToken, Integer sourceInternalVersionNumber) { + static Response editVersionMetadataFromJsonStr(String persistentId, String jsonString, String apiToken, String sourceInternalVersionTimestamp) { return given() .header(API_TOKEN_HTTP_HEADER, apiToken) .body(jsonString) @@ -779,7 +779,7 @@ static Response editVersionMetadataFromJsonStr(String persistentId, String jsonS .put("/api/datasets/:persistentId/editMetadata/?persistentId=" + persistentId + "&replace=true" - + (sourceInternalVersionNumber != null ? "&sourceInternalVersionNumber=" + sourceInternalVersionNumber : "")); + + (sourceInternalVersionTimestamp != null ? "&sourceInternalVersionTimestamp=" + sourceInternalVersionTimestamp : "")); } static Response updateDatasetPIDMetadata(String persistentId, String apiToken) { From 1320d515c98ac8e2013259a198ec92dfee0832c9 Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Wed, 30 Apr 2025 09:19:58 -0400 Subject: [PATCH 027/470] refactor optional qp name from sourceInternalVersionTimestamp to sourceLastUpdateTime --- .../11243-editmetadata-api-extension.md | 2 +- .../11392-edit-file-metadata-empty-values.md | 2 +- doc/sphinx-guides/source/api/native-api.rst | 16 ++++++++-------- .../iq/dataverse/api/AbstractApiBean.java | 8 ++++---- .../edu/harvard/iq/dataverse/api/Datasets.java | 6 +++--- .../java/edu/harvard/iq/dataverse/api/Files.java | 6 +++--- .../edu/harvard/iq/dataverse/api/DatasetsIT.java | 8 ++++---- .../edu/harvard/iq/dataverse/api/UtilIT.java | 10 +++++----- 8 files changed, 29 insertions(+), 29 deletions(-) diff --git a/doc/release-notes/11243-editmetadata-api-extension.md b/doc/release-notes/11243-editmetadata-api-extension.md index 4aaf9320074..3666d8bc30a 100644 --- a/doc/release-notes/11243-editmetadata-api-extension.md +++ b/doc/release-notes/11243-editmetadata-api-extension.md @@ -1,7 +1,7 @@ ### Edit Dataset Metadata API extension - This endpoint now allows removing fields (by sending empty values), as long as they are not required by the dataset. -- New ``sourceInternalVersionTimestamp`` optional query parameter, which prevents inconsistencies by managing updates that +- New ``sourceLastUpdateTime`` optional query parameter, which prevents inconsistencies by managing updates that may occur from other users while a dataset is being edited. NOTE: This release note was updated to conform to the refactoring of the validation as part of issue #11392 diff --git a/doc/release-notes/11392-edit-file-metadata-empty-values.md b/doc/release-notes/11392-edit-file-metadata-empty-values.md index 652aea63aed..5839fa100af 100644 --- a/doc/release-notes/11392-edit-file-metadata-empty-values.md +++ b/doc/release-notes/11392-edit-file-metadata-empty-values.md @@ -2,6 +2,6 @@ Previously the API POST /files/{id}/metadata would ignore fields with empty values. Now the API updates the fields with the empty values essentially clearing the data. Missing fields will still be ignored. -An optional query parameter (sourceInternalVersionTimestamp) was added to ensure the metadata update doesn't overwrite stale data. +An optional query parameter (sourceLastUpdateTime) was added to ensure the metadata update doesn't overwrite stale data. See also [the guides](https://dataverse-guide--11359.org.readthedocs.build/en/11359/api/native-api.html#updating-file-metadata), #11392, and #11359. diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index 352234d844a..0f6b49ba079 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -2137,26 +2137,26 @@ For these edits your JSON file need only include those dataset fields which you This endpoint also allows removing fields, as long as they are not required by the dataset. To remove a field, send an empty value (``""``) for individual fields. For multiple fields, send an empty array (``[]``). A sample JSON file for removing fields may be downloaded here: :download:`dataset-edit-metadata-delete-fields-sample.json <../_static/api/dataset-edit-metadata-delete-fields-sample.json>` -If another user updates the dataset version metadata before you send the update request, data inconsistencies may occur. To prevent this, you can use the optional ``sourceInternalVersionTimestamp`` query parameter. This parameter must include the ``lastUpdateTime`` corresponding to the dataset version being updated. The date must be in this format "yyyy-MM-dd'T'HH:mm:ss'Z'" +If another user updates the dataset version metadata before you send the update request, data inconsistencies may occur. To prevent this, you can use the optional ``sourceLastUpdateTime`` query parameter. This parameter must include the ``lastUpdateTime`` corresponding to the dataset version being updated. The date must be in this format "yyyy-MM-dd'T'HH:mm:ss'Z'" If this parameter is provided, the update will proceed only if the ``lastUpdateTime`` remains unchanged. Otherwise, the request will fail with an error. -Example using ``sourceInternalVersionTimestamp``: +Example using ``sourceLastUpdateTime``: .. code-block:: bash export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx export SERVER_URL=https://demo.dataverse.org export PERSISTENT_IDENTIFIER=doi:10.5072/FK2/BCCP9Z - export SOURCE_INTERNAL_VERSION_TIMESTAMP=2025-04-25T13:58:28Z + export SOURCE_LAST_UPDATE_TIME=2025-04-25T13:58:28Z - curl -H "X-Dataverse-key: $API_TOKEN" -X PUT "$SERVER_URL/api/datasets/:persistentId/editMetadata?persistentId=$PERSISTENT_IDENTIFIER&replace=true&sourceInternalVersionTimestamp=$SOURCE_INTERNAL_VERSION_TIMESTAMP" --upload-file dataset-update-metadata.json + curl -H "X-Dataverse-key: $API_TOKEN" -X PUT "$SERVER_URL/api/datasets/:persistentId/editMetadata?persistentId=$PERSISTENT_IDENTIFIER&replace=true&sourceLastUpdateTime=SOURCE_LAST_UPDATE_TIME" --upload-file dataset-update-metadata.json The fully expanded example above (without environment variables) looks like this: .. code-block:: bash - curl -H "X-Dataverse-key: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -X PUT "https://demo.dataverse.org/api/datasets/:persistentId/editMetadata/?persistentId=doi:10.5072/FK2/BCCP9Z&replace=true&sourceInternalVersionTimestamp=2025-04-25T13:58:28Z" --upload-file dataset-update-metadata.json + curl -H "X-Dataverse-key: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -X PUT "https://demo.dataverse.org/api/datasets/:persistentId/editMetadata/?persistentId=doi:10.5072/FK2/BCCP9Z&replace=true&sourceLastUpdateTime=2025-04-25T13:58:28Z" --upload-file dataset-update-metadata.json Delete Dataset Metadata @@ -4612,7 +4612,7 @@ Updating File Metadata Updates the file metadata for an existing file where ``ID`` is the database id of the file to update or ``PERSISTENT_ID`` is the persistent id (DOI or Handle) of the file. Requires a ``jsonString`` expressing the new metadata. No metadata from the previous version of this file will be persisted, so if you want to update a specific field first get the json with the above command and alter the fields you want. -Optional Parameter for verifying that the Dataset Version being edited is the latest version can be added &sourceInternalVersionTimestamp=datetime(in format: "yyyy-MM-dd'T'HH:mm:ss'Z'"). This is to prevent stale data from being edited. The value for sourceInternalVersionTimestamp comes from ``lastUpdateTime`` in the response to get $SERVER_URL/api/files/$ID API call +Optional Parameter for verifying that the Dataset Version being edited is the latest version can be added &sourceLastUpdateTime=datetime(in format: "yyyy-MM-dd'T'HH:mm:ss'Z'"). This is to prevent stale data from being edited. The value for sourceLastUpdateTime comes from ``lastUpdateTime`` in the response to get $SERVER_URL/api/files/$ID API call A curl example using an ``ID`` @@ -4645,7 +4645,7 @@ A curl example using a ``PERSISTENT_ID`` curl -H "X-Dataverse-key:$API_TOKEN" -X POST \ -F 'jsonData={"description":"My description bbb.","provFreeform":"Test prov freeform","categories":["Data"],"dataFileTags":["Survey"],"restrict":false}' \ - "$SERVER_URL/api/files/:persistentId/metadata?persistentId=$PERSISTENT_ID&sourceInternalVersionTimestamp=$UPDATE_TIME" + "$SERVER_URL/api/files/:persistentId/metadata?persistentId=$PERSISTENT_ID&sourceLastUpdateTime=$UPDATE_TIME" The fully expanded example above (without environment variables) looks like this: @@ -4653,7 +4653,7 @@ The fully expanded example above (without environment variables) looks like this curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -X POST \ -F 'jsonData={"description":"My description bbb.","provFreeform":"Test prov freeform","categories":["Data"],"dataFileTags":["Survey"],"restrict":false}' \ - "https://demo.dataverse.org/api/files/:persistentId/metadata?persistentId=doi:10.5072/FK2/AAA000&sourceInternalVersionTimestamp=2025-04-25T13:58:28Z" + "https://demo.dataverse.org/api/files/:persistentId/metadata?persistentId=doi:10.5072/FK2/AAA000&sourceLastUpdateTime=2025-04-25T13:58:28Z" Note: To update the 'tabularTags' property of file metadata, use the 'dataFileTags' key when making API requests. This property is used to update the 'tabularTags' of the file metadata. diff --git a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java index c53f9f8119c..77c003ed3cb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java @@ -445,11 +445,11 @@ public Command handleLatestPublished() { return dsv; } - protected void validateInternalTimestampIsNotOutdated(DvObject dvObject, String sourceInternalVersionTimestamp) throws WrappedResponse { - Date date = sourceInternalVersionTimestamp != null ? DateUtil.parseDate(sourceInternalVersionTimestamp, "yyyy-MM-dd'T'HH:mm:ss'Z'") : null; + protected void validateInternalTimestampIsNotOutdated(DvObject dvObject, String sourceLastUpdateTime) throws WrappedResponse { + Date date = sourceLastUpdateTime != null ? DateUtil.parseDate(sourceLastUpdateTime, "yyyy-MM-dd'T'HH:mm:ss'Z'") : null; if (date == null) { throw new WrappedResponse( - badRequest(BundleUtil.getStringFromBundle("jsonparser.error.parsing.date", Collections.singletonList(sourceInternalVersionTimestamp))) + badRequest(BundleUtil.getStringFromBundle("jsonparser.error.parsing.date", Collections.singletonList(sourceLastUpdateTime))) ); } Instant instant = date.toInstant(); @@ -460,7 +460,7 @@ protected void validateInternalTimestampIsNotOutdated(DvObject dvObject, String // granularity is to the second since the json output only returns dates in this format to the second if (updateTimestamp.getEpochSecond() != instant.getEpochSecond()) { throw new WrappedResponse( - badRequest(BundleUtil.getStringFromBundle("abstractApiBean.error.internalVersionTimestampIsOutdated", Collections.singletonList(sourceInternalVersionTimestamp))) + badRequest(BundleUtil.getStringFromBundle("abstractApiBean.error.internalVersionTimestampIsOutdated", Collections.singletonList(sourceLastUpdateTime))) ); } } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index e36b50ad0e0..bfcf530b57e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -1095,12 +1095,12 @@ private String getCompoundDisplayValue (DatasetFieldCompoundValue dscv){ @Path("{id}/editMetadata") public Response editVersionMetadata(@Context ContainerRequestContext crc, String jsonBody, @PathParam("id") String id, @QueryParam("replace") boolean replaceData, - @QueryParam("sourceInternalVersionTimestamp") String sourceInternalVersionTimestamp) { + @QueryParam("sourceLastUpdateTime") String sourceLastUpdateTime) { try { Dataset dataset = findDatasetOrDie(id); - if (sourceInternalVersionTimestamp != null) { - validateInternalTimestampIsNotOutdated(dataset, sourceInternalVersionTimestamp); + if (sourceLastUpdateTime != null) { + validateInternalTimestampIsNotOutdated(dataset, sourceLastUpdateTime); } JsonObject json = JsonUtil.getJsonObject(jsonBody); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Files.java b/src/main/java/edu/harvard/iq/dataverse/api/Files.java index 1b809894e17..5834e7e0008 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Files.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Files.java @@ -410,7 +410,7 @@ public Response deleteFileInDataset(@Context ContainerRequestContext crc, @PathP @AuthRequired @Path("{id}/metadata") public Response updateFileMetadata(@Context ContainerRequestContext crc, @FormDataParam("jsonData") String jsonData, - @PathParam("id") String fileIdOrPersistentId, @QueryParam("sourceInternalVersionTimestamp") String sourceInternalVersionTimestamp) { + @PathParam("id") String fileIdOrPersistentId, @QueryParam("sourceLastUpdateTime") String sourceLastUpdateTime) { FileMetadata upFmd = null; @@ -428,9 +428,9 @@ public Response updateFileMetadata(@Context ContainerRequestContext crc, @FormDa return error(BAD_REQUEST, "Error attempting get the requested data file."); } - if (sourceInternalVersionTimestamp != null) { + if (sourceLastUpdateTime != null) { try { - validateInternalTimestampIsNotOutdated(df, sourceInternalVersionTimestamp); + validateInternalTimestampIsNotOutdated(df, sourceLastUpdateTime); } catch (WrappedResponse wr) { return wr.getResponse(); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java index 13837bed859..162c4b0e125 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java @@ -676,9 +676,9 @@ public void testAddUpdateDatasetViaNativeAPI() { .body("data.metadataBlocks.citation.fields[2].typeName", not(equalTo("alternativeTitle"))) .statusCode(OK.getStatusCode()); - // Test sourceInternalVersionTimestamp optional query parameter - String sourceInternalVersionTimestamp = updateMetadataRemoveAlternativeTitles.then().extract().path("data.lastUpdateTime"); - assertNotNull(sourceInternalVersionTimestamp); + // Test sourceLastUpdateTime optional query parameter + String sourceLastUpdateTime = updateMetadataRemoveAlternativeTitles.then().extract().path("data.lastUpdateTime"); + assertNotNull(sourceLastUpdateTime); String oldTimestamp = "2025-04-25T13:58:28Z"; // Case 1 - Pass outdated internal version number @@ -690,7 +690,7 @@ public void testAddUpdateDatasetViaNativeAPI() { // Case 2 - Pass latest internal version number - Response updateMetadataWithLatestInternalVersionNumber = UtilIT.editVersionMetadataFromJsonStr(datasetPersistentId, jsonString, apiToken, sourceInternalVersionTimestamp); + Response updateMetadataWithLatestInternalVersionNumber = UtilIT.editVersionMetadataFromJsonStr(datasetPersistentId, jsonString, apiToken, sourceLastUpdateTime); updateMetadataWithLatestInternalVersionNumber.then().assertThat() .statusCode(OK.getStatusCode()); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index 9d85903dde3..672b43c11fa 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -771,7 +771,7 @@ static Response editVersionMetadataFromJsonStr(String persistentId, String jsonS return editVersionMetadataFromJsonStr(persistentId, jsonString, apiToken, null); } - static Response editVersionMetadataFromJsonStr(String persistentId, String jsonString, String apiToken, String sourceInternalVersionTimestamp) { + static Response editVersionMetadataFromJsonStr(String persistentId, String jsonString, String apiToken, String sourceLastUpdateTime) { return given() .header(API_TOKEN_HTTP_HEADER, apiToken) .body(jsonString) @@ -779,7 +779,7 @@ static Response editVersionMetadataFromJsonStr(String persistentId, String jsonS .put("/api/datasets/:persistentId/editMetadata/?persistentId=" + persistentId + "&replace=true" - + (sourceInternalVersionTimestamp != null ? "&sourceInternalVersionTimestamp=" + sourceInternalVersionTimestamp : "")); + + (sourceLastUpdateTime != null ? "&sourceLastUpdateTime=" + sourceLastUpdateTime : "")); } static Response updateDatasetPIDMetadata(String persistentId, String apiToken) { @@ -1092,15 +1092,15 @@ static Response deleteFileApi(Integer fileId, String apiToken) { static Response updateFileMetadata(String fileIdOrPersistentId, String jsonAsString, String apiToken) { return updateFileMetadata(fileIdOrPersistentId, jsonAsString,apiToken, null); } - static Response updateFileMetadata(String fileIdOrPersistentId, String jsonAsString, String apiToken, String sourceInternalVersionTimestamp) { + static Response updateFileMetadata(String fileIdOrPersistentId, String jsonAsString, String apiToken, String sourceLastUpdateTime) { String idInPath = fileIdOrPersistentId; // Assume it's a number. String optionalQueryParam = ""; // If idOrPersistentId is a number we'll just put it in the path. if (!NumberUtils.isCreatable(fileIdOrPersistentId)) { idInPath = ":persistentId"; optionalQueryParam = "?persistentId=" + fileIdOrPersistentId; } - if (sourceInternalVersionTimestamp != null) { - optionalQueryParam = optionalQueryParam + (optionalQueryParam.isEmpty() ? "?" : "&") + "sourceInternalVersionTimestamp=" + sourceInternalVersionTimestamp; + if (sourceLastUpdateTime != null) { + optionalQueryParam = optionalQueryParam + (optionalQueryParam.isEmpty() ? "?" : "&") + "sourceLastUpdateTime=" + sourceLastUpdateTime; } RequestSpecification requestSpecification = given() .header(API_TOKEN_HTTP_HEADER, apiToken); From 418a8168eb428fce03281fe65ec63f0a41f29d30 Mon Sep 17 00:00:00 2001 From: jo-pol Date: Thu, 1 May 2025 09:17:45 +0200 Subject: [PATCH 028/470] abr does not return a vocabulary-name/uri --- .../resources/json/cvoc-dans-config/abrArtifact.json | 12 ------------ .../resources/json/cvoc-dans-config/abrComplex.json | 12 ------------ .../resources/json/cvoc-dans-config/abrPeriod.json | 12 ------------ .../json/cvoc-dans-config/abrRapportType.json | 12 ------------ .../json/cvoc-dans-config/abrVerwervingswijze.json | 12 ------------ 5 files changed, 60 deletions(-) diff --git a/src/test/resources/json/cvoc-dans-config/abrArtifact.json b/src/test/resources/json/cvoc-dans-config/abrArtifact.json index 590f8cc5ccc..73d2cc399e2 100644 --- a/src/test/resources/json/cvoc-dans-config/abrArtifact.json +++ b/src/test/resources/json/cvoc-dans-config/abrArtifact.json @@ -34,18 +34,6 @@ "params": [ "/graph/uri=@id/prefLabel" ] - }, - "vocabularyName": { - "pattern": "{0}", - "params": [ - "/graph/type=skos:ConceptScheme/label" - ] - }, - "vocabularyUri": { - "pattern": "{0}", - "params": [ - "/graph/type=skos:ConceptScheme/uri" - ] } } } diff --git a/src/test/resources/json/cvoc-dans-config/abrComplex.json b/src/test/resources/json/cvoc-dans-config/abrComplex.json index 8a5caacc18d..9df15c6b1c3 100644 --- a/src/test/resources/json/cvoc-dans-config/abrComplex.json +++ b/src/test/resources/json/cvoc-dans-config/abrComplex.json @@ -34,18 +34,6 @@ "params": [ "/graph/uri=@id/prefLabel" ] - }, - "vocabularyName": { - "pattern": "{0}", - "params": [ - "/graph/type=skos:ConceptScheme/label" - ] - }, - "vocabularyUri": { - "pattern": "{0}", - "params": [ - "/graph/type=skos:ConceptScheme/uri" - ] } } } diff --git a/src/test/resources/json/cvoc-dans-config/abrPeriod.json b/src/test/resources/json/cvoc-dans-config/abrPeriod.json index e67674bce86..2aaec1298ac 100644 --- a/src/test/resources/json/cvoc-dans-config/abrPeriod.json +++ b/src/test/resources/json/cvoc-dans-config/abrPeriod.json @@ -34,18 +34,6 @@ "params": [ "/graph/uri=@id/prefLabel" ] - }, - "vocabularyName": { - "pattern": "{0}", - "params": [ - "/graph/type=skos:ConceptScheme/label" - ] - }, - "vocabularyUri": { - "pattern": "{0}", - "params": [ - "/graph/type=skos:ConceptScheme/uri" - ] } } } diff --git a/src/test/resources/json/cvoc-dans-config/abrRapportType.json b/src/test/resources/json/cvoc-dans-config/abrRapportType.json index d370c099f27..d8be4c27082 100644 --- a/src/test/resources/json/cvoc-dans-config/abrRapportType.json +++ b/src/test/resources/json/cvoc-dans-config/abrRapportType.json @@ -34,18 +34,6 @@ "params": [ "/graph/uri=@id/prefLabel" ] - }, - "vocabularyName": { - "pattern": "{0}", - "params": [ - "/graph/type=skos:ConceptScheme/label" - ] - }, - "vocabularyUri": { - "pattern": "{0}", - "params": [ - "/graph/type=skos:ConceptScheme/uri" - ] } } } diff --git a/src/test/resources/json/cvoc-dans-config/abrVerwervingswijze.json b/src/test/resources/json/cvoc-dans-config/abrVerwervingswijze.json index 18cb5d59ffc..09d8e372f4e 100644 --- a/src/test/resources/json/cvoc-dans-config/abrVerwervingswijze.json +++ b/src/test/resources/json/cvoc-dans-config/abrVerwervingswijze.json @@ -34,18 +34,6 @@ "params": [ "/graph/uri=@id/prefLabel" ] - }, - "vocabularyName": { - "pattern": "{0}", - "params": [ - "/graph/type=skos:ConceptScheme/label" - ] - }, - "vocabularyUri": { - "pattern": "{0}", - "params": [ - "/graph/type=skos:ConceptScheme/uri" - ] } } } From 1f5792c1a29de5da268407abf926171e691f1640 Mon Sep 17 00:00:00 2001 From: jo-pol Date: Thu, 1 May 2025 10:21:22 +0200 Subject: [PATCH 029/470] preflabel for collection, hard coded vocabulary name/uri --- ...setFieldServiceBeanFilterResponseTest.java | 19 +++++- .../json/cvoc-dans-config/abrArtifact.json | 8 +++ .../json/cvoc-dans-value/collection.json | 67 +++++++++++++++++++ 3 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/json/cvoc-dans-value/collection.json diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java index ead20657b68..4dfb46a8360 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java @@ -62,6 +62,22 @@ void audience() throws Exception { assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } + @Test + void collection() throws Exception { + String termURI = "https://vocabularies.dans.knaw.nl/collections/archaeology/ArcheoDepot"; + JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/collection.json"); + JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/collection.json"); + + JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); + + Map expectedValues = Map.of( + "nl", "ArcheoDepot" + ); + assertThat(result.getString("@id")).isEqualTo(termURI); + assertTermNameValues(result, expectedValues); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); + } + @Test void abrPeriod() throws Exception { String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f"; @@ -90,8 +106,9 @@ void abrArtifact() throws Exception { "nl", "steen" ); assertThat(result.getString("@id")).isEqualTo(termURI); + assertThat(result.getString("vocabularyName")).isEqualTo("ABR artifact"); assertTermNameValues(result, expectedValues); - assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName"); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyName", "vocabularyUri"); } @Test diff --git a/src/test/resources/json/cvoc-dans-config/abrArtifact.json b/src/test/resources/json/cvoc-dans-config/abrArtifact.json index 73d2cc399e2..e097d84b9ab 100644 --- a/src/test/resources/json/cvoc-dans-config/abrArtifact.json +++ b/src/test/resources/json/cvoc-dans-config/abrArtifact.json @@ -34,6 +34,14 @@ "params": [ "/graph/uri=@id/prefLabel" ] + }, + "vocabularyName": { + "pattern": "ABR artifact", + "params": [] + }, + "vocabularyUri": { + "pattern": "https://data.cultureelerfgoed.nl/term/id/abr/22cbb070-6542-48f0-8afe-7d98d398cc0b", + "params": [] } } } diff --git a/src/test/resources/json/cvoc-dans-value/collection.json b/src/test/resources/json/cvoc-dans-value/collection.json new file mode 100644 index 00000000000..7df76cad9b7 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-value/collection.json @@ -0,0 +1,67 @@ +{ + "@context": { + "skos": "http://www.w3.org/2004/02/skos/core#", + "isothes": "http://purl.org/iso25964/skos-thes#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "owl": "http://www.w3.org/2002/07/owl#", + "dct": "http://purl.org/dc/terms/", + "dc11": "http://purl.org/dc/elements/1.1/", + "uri": "@id", + "type": "@type", + "lang": "@language", + "value": "@value", + "graph": "@graph", + "label": "rdfs:label", + "prefLabel": "skos:prefLabel", + "altLabel": "skos:altLabel", + "hiddenLabel": "skos:hiddenLabel", + "broader": "skos:broader", + "narrower": "skos:narrower", + "related": "skos:related", + "inScheme": "skos:inScheme", + "exactMatch": "skos:exactMatch", + "closeMatch": "skos:closeMatch", + "broadMatch": "skos:broadMatch", + "narrowMatch": "skos:narrowMatch", + "relatedMatch": "skos:relatedMatch" + }, + "graph": [ + { + "uri": "https://vocabularies.dans.knaw.nl/collections", + "type": "skos:ConceptScheme", + "prefLabel": { + "lang": "nl", + "value": "DansCollections" + } + }, + { + "uri": "https://vocabularies.dans.knaw.nl/collections/archaeology", + "type": "skos:Concept", + "narrower": { + "uri": "https://vocabularies.dans.knaw.nl/collections/archaeology/ArcheoDepot" + }, + "prefLabel": { + "lang": "nl", + "value": "Archaeology" + } + }, + { + "uri": "https://vocabularies.dans.knaw.nl/collections/archaeology/ArcheoDepot", + "type": "skos:Concept", + "broader": { + "uri": "https://vocabularies.dans.knaw.nl/collections/archaeology" + }, + "skos:definition": { + "lang": "nl", + "value": "ArcheoDepot" + }, + "inScheme": { + "uri": "https://vocabularies.dans.knaw.nl/collections" + }, + "prefLabel": { + "lang": "nl", + "value": "ArcheoDepot" + } + } + ] +} \ No newline at end of file From 36fd833b8256f1d903843d988d36c308a39f256a Mon Sep 17 00:00:00 2001 From: jo-pol Date: Thu, 1 May 2025 11:07:02 +0200 Subject: [PATCH 030/470] AAT classification (test fails) --- ...atasetFieldServiceBeanFilterResponseTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java index 4dfb46a8360..b804b7e91d2 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java @@ -78,6 +78,22 @@ void collection() throws Exception { assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } + @Test + void aatClassification() throws Exception { + String termURI = "https://vocab.getty.edu/aat/300187008"; + JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/AATClassification.json"); + JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/AATClassification.json"); + + JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); + + Map expectedValues = Map.of( + "nl", "Abnakee rugs" + ); + assertThat(result.getString("@id")).isEqualTo(termURI); + assertTermNameValues(result, expectedValues); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); + } + @Test void abrPeriod() throws Exception { String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f"; From 4f6a14e4162218d144a881df27ccd14622ec85e5 Mon Sep 17 00:00:00 2001 From: jo-pol Date: Thu, 1 May 2025 11:48:50 +0200 Subject: [PATCH 031/470] simplified assertions --- ...setFieldServiceBeanFilterResponseTest.java | 95 +- .../cvoc-dans-config/AATClassification.json | 12 +- .../json/cvoc-dans-config/abrComplex.json | 8 + .../json/cvoc-dans-config/abrPeriod.json | 8 + .../json/cvoc-dans-config/abrRapportType.json | 8 + .../cvoc-dans-config/abrVerwervingswijze.json | 8 + .../cvoc-dans-value/AATClassification.json | 1501 +++++++++++++++++ 7 files changed, 1569 insertions(+), 71 deletions(-) create mode 100644 src/test/resources/json/cvoc-dans-value/AATClassification.json diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java index b804b7e91d2..de199b95a97 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java @@ -3,6 +3,7 @@ import jakarta.json.Json; import jakarta.json.JsonArray; import jakarta.json.JsonObject; +import jakarta.json.JsonValue; import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -53,12 +54,9 @@ void audience() throws Exception { JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); - Map expectedValues = Map.of( - "en", "Theoretical chemistry, quantum chemistry", - "nl", "Theoretische chemie, kwantumchemie" - ); assertThat(result.getString("@id")).isEqualTo(termURI); - assertTermNameValues(result, expectedValues); + assertThat(geDutchValue(result.get("vocabularyName"))).startsWith("Classificatiecodes van de wetenschapsportal Narcis (www.narcis.nl)."); + assertThat(geDutchValue(result.get("termName"))).startsWith("Theoretische chemie, kwantumchemie"); assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } @@ -70,11 +68,9 @@ void collection() throws Exception { JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); - Map expectedValues = Map.of( - "nl", "ArcheoDepot" - ); assertThat(result.getString("@id")).isEqualTo(termURI); - assertTermNameValues(result, expectedValues); + assertThat(geDutchValue(result.get("vocabularyName"))).isEqualTo("DansCollections"); + assertThat(geDutchValue(result.get("termName"))).isEqualTo("ArcheoDepot"); assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } @@ -86,11 +82,8 @@ void aatClassification() throws Exception { JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); - Map expectedValues = Map.of( - "nl", "Abnakee rugs" - ); assertThat(result.getString("@id")).isEqualTo(termURI); - assertTermNameValues(result, expectedValues); + assertThat(geDutchValue(result.get("termName"))).isEqualTo("Abnakee rugs"); assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } @@ -102,12 +95,10 @@ void abrPeriod() throws Exception { JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); - Map expectedValues = Map.of( - "nl", "Vroege Middeleeuwen D" - ); assertThat(result.getString("@id")).isEqualTo(termURI); - assertTermNameValues(result, expectedValues); - assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName"); + assertThat(result.getString("vocabularyName")).isEqualTo("ABR perioden"); + assertThat(geDutchValue(result.get("termName"))).isEqualTo("Vroege Middeleeuwen D"); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } @Test @@ -118,13 +109,10 @@ void abrArtifact() throws Exception { JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); - Map expectedValues = Map.of( - "nl", "steen" - ); assertThat(result.getString("@id")).isEqualTo(termURI); assertThat(result.getString("vocabularyName")).isEqualTo("ABR artifact"); - assertTermNameValues(result, expectedValues); - assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyName", "vocabularyUri"); + assertThat(geDutchValue(result.get("termName"))).isEqualTo("steen"); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } @Test @@ -135,12 +123,10 @@ void abrVerwervingswijze() throws Exception { JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); - Map expectedValues = Map.of( - "nl", "archeologisch: booronderzoek" - ); assertThat(result.getString("@id")).isEqualTo(termURI); - assertTermNameValues(result, expectedValues); - assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName"); + assertThat(result.getString("vocabularyName")).isEqualTo("ABR verwervingswijzen"); + assertThat(geDutchValue(result.get("termName"))).isEqualTo("archeologisch: booronderzoek"); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } @Test @@ -151,12 +137,10 @@ void abrRapportType() throws Exception { JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); - Map expectedValues = Map.of( - "nl", "Achterhoekse Archeologische Publicaties" - ); assertThat(result.getString("@id")).isEqualTo(termURI); - assertTermNameValues(result, expectedValues); - assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName"); + assertThat(result.getString("vocabularyName")).isEqualTo("ABR rapporten"); + assertThat(geDutchValue(result.get("termName"))).isEqualTo("Achterhoekse Archeologische Publicaties"); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } @Test @@ -166,37 +150,26 @@ void abrComplex() throws Exception { JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/abrComplex.json"); JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); - - Map expectedValues = Map.of( - "nl", "(ring)walburg" - ); assertThat(result.getString("@id")).isEqualTo(termURI); - assertTermNameValues(result, expectedValues); - assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName"); - } - - private void assertTermNameValues(JsonObject result, Map expectedValues) { - assertThat(termNameValues(result)) - .withFailMessage("Expected result with termName values: %s but got: %s", expectedValues, result) - .containsExactlyInAnyOrderEntriesOf(expectedValues); + assertThat(result.getString("vocabularyName")).isEqualTo("ABR complextypen"); + assertThat(geDutchValue(result.get("termName"))).isEqualTo("(ring)walburg"); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } - - private Map termNameValues(JsonObject result) { - var termName = result.get("termName"); - if (termName == null) { - return Map.of(); - } - if(termName instanceof JsonArray) { - return ((JsonArray) termName).stream() - .map(jsonValue -> (JsonObject) jsonValue) - .collect(Collectors.toMap( - jsonObject -> jsonObject.getString("lang"), - jsonObject -> jsonObject.getString("value") - )); - } else { - var tn = (JsonObject) termName; - return Map.of(tn.getString("lang"), tn.getString("value")); + private String geDutchValue(JsonValue values) { + if (values instanceof JsonArray) { + for (var item : (JsonArray) values) { + JsonObject obj = item.asJsonObject(); + if ("nl".equals(obj.getString("lang", ""))) { + return obj.getString("value"); + } + } + } else if (values instanceof JsonObject) { + JsonObject obj = (JsonObject) values; + if ("nl".equals(obj.getString("lang", ""))) { + return obj.getString("value"); + } } + return null; // Return null if no match is found } // TODO add more tests for other CVOC entries diff --git a/src/test/resources/json/cvoc-dans-config/AATClassification.json b/src/test/resources/json/cvoc-dans-config/AATClassification.json index e0d11d39b00..c6ee9357576 100644 --- a/src/test/resources/json/cvoc-dans-config/AATClassification.json +++ b/src/test/resources/json/cvoc-dans-config/AATClassification.json @@ -36,16 +36,8 @@ ] }, "vocabularyName": { - "pattern": "{0}", - "params": [ - "/graph/type=skos:ConceptScheme/label" - ] - }, - "vocabularyUri": { - "pattern": "{0}", - "params": [ - "/graph/type=skos:ConceptScheme/uri" - ] + "pattern": "Art & Architecture Thesaurus", + "params": [] } } } diff --git a/src/test/resources/json/cvoc-dans-config/abrComplex.json b/src/test/resources/json/cvoc-dans-config/abrComplex.json index 9df15c6b1c3..f0b492ea271 100644 --- a/src/test/resources/json/cvoc-dans-config/abrComplex.json +++ b/src/test/resources/json/cvoc-dans-config/abrComplex.json @@ -34,6 +34,14 @@ "params": [ "/graph/uri=@id/prefLabel" ] + }, + "vocabularyName": { + "pattern": "ABR complextypen", + "params": [] + }, + "vocabularyUri": { + "pattern": "https://data.cultureelerfgoed.nl/term/id/abr/e9546020-4b28-4819-b0c2-29e7c864c5c0", + "params": [] } } } diff --git a/src/test/resources/json/cvoc-dans-config/abrPeriod.json b/src/test/resources/json/cvoc-dans-config/abrPeriod.json index 2aaec1298ac..e1e6056e04a 100644 --- a/src/test/resources/json/cvoc-dans-config/abrPeriod.json +++ b/src/test/resources/json/cvoc-dans-config/abrPeriod.json @@ -34,6 +34,14 @@ "params": [ "/graph/uri=@id/prefLabel" ] + }, + "vocabularyName": { + "pattern": "ABR perioden", + "params": [] + }, + "vocabularyUri": { + "pattern": "https://data.cultureelerfgoed.nl/term/id/abr/9b688754-1315-484b-9c89-8817e87c1e84", + "params": [] } } } diff --git a/src/test/resources/json/cvoc-dans-config/abrRapportType.json b/src/test/resources/json/cvoc-dans-config/abrRapportType.json index d8be4c27082..2c278710d58 100644 --- a/src/test/resources/json/cvoc-dans-config/abrRapportType.json +++ b/src/test/resources/json/cvoc-dans-config/abrRapportType.json @@ -34,6 +34,14 @@ "params": [ "/graph/uri=@id/prefLabel" ] + }, + "vocabularyName": { + "pattern": "ABR rapporten", + "params": [] + }, + "vocabularyUri": { + "pattern": "https://data.cultureelerfgoed.nl/term/id/abr/7a99aaba-c1e7-49a4-9dd8-d295dbcc870e", + "params": [] } } } diff --git a/src/test/resources/json/cvoc-dans-config/abrVerwervingswijze.json b/src/test/resources/json/cvoc-dans-config/abrVerwervingswijze.json index 09d8e372f4e..47ac732b04c 100644 --- a/src/test/resources/json/cvoc-dans-config/abrVerwervingswijze.json +++ b/src/test/resources/json/cvoc-dans-config/abrVerwervingswijze.json @@ -34,6 +34,14 @@ "params": [ "/graph/uri=@id/prefLabel" ] + }, + "vocabularyName": { + "pattern": "ABR verwervingswijzen", + "params": [] + }, + "vocabularyUri": { + "pattern": "https://data.cultureelerfgoed.nl/term/id/abr/554ca1ec-3ed8-42d3-ae4b-47bcb848b238", + "params": [] } } } diff --git a/src/test/resources/json/cvoc-dans-value/AATClassification.json b/src/test/resources/json/cvoc-dans-value/AATClassification.json new file mode 100644 index 00000000000..9a2d81a0f8a --- /dev/null +++ b/src/test/resources/json/cvoc-dans-value/AATClassification.json @@ -0,0 +1,1501 @@ +{ + "@context": "https://linked.art/ns/v1/linked-art.json", + "id": "http://vocab.getty.edu/aat/300187008", + "type": "Type", + "subject_of": [ + { + "id": "http://vocab.getty.edu/aat/scopeNote/38789", + "type": "LinguisticObject", + "content": "Hooked rugs popular in the early 20th century with designs inspired by Native American rug motifs.", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300435416", + "type": "Type", + "_label": "descriptive note" + } + ], + "referred_to_by": [ + { + "id": "http://vocab.getty.edu/aat/300187008#description-300187008-source-2000099620", + "type": "Name", + "content": "Legacy Art & Architecture Thesaurus (AAT) data. Compiled without citing sources. Warranted by AAT staff. 1983-1995. ", + "identifies": "http://vocab.getty.edu/aat/source/2000099620", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#description-300187008-contributor-10000000", + "type": "Name", + "content": "Getty Vocabulary Program", + "identifies": "http://vocab.getty.edu/aat/contrib/10000000", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + } + ], + "language": [ + { + "id": "http://vocab.getty.edu/language/en", + "type": "Language", + "_label": "en" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/scopeNote/91823", + "type": "LinguisticObject", + "content": "Gehaakte tapijten die populair waren in het begin van de twintigste eeuw en bestaan uit een ontwerp dat is geïnspireerd op motieven van tapijten van de oorspronkelijke inwoners van Amerika.", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300435416", + "type": "Type", + "_label": "descriptive note" + } + ], + "referred_to_by": [ + { + "id": "http://vocab.getty.edu/aat/300187008#description-300187008-source-2000113770", + "type": "Name", + "content": "AAT Ned: Dutch AAT Translation Project coordinated by RKD (Netherlands Institute for Art History). The Hague, Bureau AAT, 1994-.", + "identifies": "http://vocab.getty.edu/aat/source/2000113770", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#description-300187008-contributor-10000205", + "type": "Name", + "content": "Netherlands Institute for Art History (RKD, The Hague) and the Royal Institute for Cultural Heritage (Brussels); Dutch translation collaboration between the Netherlands and Flanders", + "identifies": "http://vocab.getty.edu/aat/contrib/10000205", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + } + ], + "language": [ + { + "id": "http://vocab.getty.edu/language/nl", + "type": "Language", + "_label": "nl" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/scopeNote/73530", + "type": "LinguisticObject", + "content": "Tapices hechos con ganchillo populares a comienzos del siglo XX con diseños inspirados por los motivos de los tapices nativos americanos.", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300435416", + "type": "Type", + "_label": "descriptive note" + } + ], + "referred_to_by": [ + { + "id": "http://vocab.getty.edu/aat/300187008#description-300187008-source-2000051034", + "type": "Name", + "content": "Tesauro de Arte & Arquitectura database. Centro de Documentación de Bienes Patrimoniales, DIBAM. Santiago, Chile: 2000-. ", + "identifies": "http://vocab.getty.edu/aat/source/2000051034", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#description-300187008-contributor-10000131", + "type": "Name", + "content": "Centro de Documentación de Bienes Patrimoniales (Servicio Nacional del Patrimonio Cultural, Ministerio de las Culturas las Artes y el Patrimonio; Santiago, Chile)", + "identifies": "http://vocab.getty.edu/aat/contrib/10000131", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + } + ], + "language": [ + { + "id": "http://vocab.getty.edu/language/es", + "type": "Language", + "_label": "es" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/scopeNote/151329", + "type": "LinguisticObject", + "content": "流行於二十世紀早期的鉤針地毯,設計靈感來自美洲原住民的地毯圖案。", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300435416", + "type": "Type", + "_label": "descriptive note" + } + ], + "referred_to_by": [ + { + "id": "http://vocab.getty.edu/aat/300187008#description-300187008-source-2000079740", + "type": "Name", + "content": "Academia Sinica (Academia Sinica; Nankang, Taiwan). Formerly TELDAP. (2014-)", + "identifies": "http://vocab.getty.edu/aat/source/2000079740", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#description-300187008-contributor-10000250", + "type": "Name", + "content": "Academia Sinica (Nankang, Taiwan)", + "identifies": "http://vocab.getty.edu/aat/contrib/10000250", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + } + ], + "language": [ + { + "id": "http://vocab.getty.edu/language/zh-hant", + "type": "Language", + "_label": "zh-hant" + } + ] + } + ], + "identified_by": [ + { + "id": "http://vocab.getty.edu/aat/term/1000187008-en", + "type": "Name", + "alternative": [ + { + "id": "http://vocab.getty.edu/aat/300187008#qualified-1000187008-en", + "type": "Name", + "content": "Abnakee rugs", + "language": [ + { + "id": "http://vocab.getty.edu/language/en", + "type": "Language", + "_label": "en" + } + ] + } + ], + "content": "Abnakee rugs", + "classified_as": [ + { + "id": "http://vocab.getty.edu/term/type/Descriptor", + "type": "Type", + "_label": "Descriptor" + }, + { + "id": "http://vocab.getty.edu/term/POS/PluralNoun", + "type": "Type", + "_label": "Plural Noun" + }, + { + "id": "http://vocab.getty.edu/aat/300404670", + "type": "Type", + "_label": "preferred term" + } + ], + "referred_to_by": [ + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000187008-source-2000046658", + "type": "Name", + "content": "Antiques. New York: Straight Enterprises, 1922-.", + "identifies": "http://vocab.getty.edu/aat/source/2000046658", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000187008-contributor-10000000", + "type": "Name", + "content": "Getty Vocabulary Program", + "identifies": "http://vocab.getty.edu/aat/contrib/10000000", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + } + ], + "language": [ + { + "id": "http://vocab.getty.edu/language/en", + "type": "Language", + "_label": "en" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/term/1000822693-zh-Hant", + "type": "Name", + "alternative": [ + { + "id": "http://vocab.getty.edu/aat/300187008#qualified-1000822693-zh-hant", + "type": "Name", + "content": "阿布納基鉤針地毯", + "language": [ + { + "id": "http://vocab.getty.edu/language/zh-hant", + "type": "Language", + "_label": "zh-hant" + } + ] + } + ], + "content": "阿布納基鉤針地毯", + "classified_as": [ + { + "id": "http://vocab.getty.edu/term/type/Descriptor", + "type": "Type", + "_label": "Descriptor" + }, + { + "id": "http://vocab.getty.edu/term/POS/NeuterAdjectival", + "type": "Type", + "_label": "neuter adjectival" + } + ], + "referred_to_by": [ + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000822693-source-2000079740", + "type": "Name", + "content": "Academia Sinica (Academia Sinica; Nankang, Taiwan). Formerly TELDAP. (2014-)", + "identifies": "http://vocab.getty.edu/aat/source/2000079740", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000822693-contributor-10000250", + "type": "Name", + "content": "Academia Sinica (Nankang, Taiwan)", + "identifies": "http://vocab.getty.edu/aat/contrib/10000250", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + } + ], + "language": [ + { + "id": "http://vocab.getty.edu/language/zh-hant", + "type": "Language", + "_label": "zh-hant" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/term/1000822696-zh-Latn-pinyin-x-hanyu", + "type": "Name", + "alternative": [ + { + "id": "http://vocab.getty.edu/aat/300187008#qualified-1000822696-zh-latn-pinyin-x-hanyu", + "type": "Name", + "content": "ā bù nà jī gōu zhēn dì tǎn", + "language": [ + { + "id": "http://vocab.getty.edu/language/zh-latn-pinyin-x-hanyu", + "type": "Language", + "_label": "zh-latn-pinyin-x-hanyu" + } + ] + } + ], + "content": "ā bù nà jī gōu zhēn dì tǎn", + "classified_as": [ + { + "id": "http://vocab.getty.edu/term/type/UsedForTerm", + "type": "Type", + "_label": "Used for Term" + }, + { + "id": "http://vocab.getty.edu/term/POS/NeuterAdjectival", + "type": "Type", + "_label": "neuter adjectival" + } + ], + "referred_to_by": [ + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000822696-source-2000079740", + "type": "Name", + "content": "Academia Sinica (Academia Sinica; Nankang, Taiwan). Formerly TELDAP. (2014-)", + "identifies": "http://vocab.getty.edu/aat/source/2000079740", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000822696-contributor-10000250", + "type": "Name", + "content": "Academia Sinica (Nankang, Taiwan)", + "identifies": "http://vocab.getty.edu/aat/contrib/10000250", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + } + ], + "language": [ + { + "id": "http://vocab.getty.edu/language/zh-latn-pinyin-x-hanyu", + "type": "Language", + "_label": "zh-latn-pinyin-x-hanyu" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/term/1000822695-zh-Latn-pinyin-x-notone", + "type": "Name", + "alternative": [ + { + "id": "http://vocab.getty.edu/aat/300187008#qualified-1000822695-zh-latn-pinyin-x-notone", + "type": "Name", + "content": "a bu na ji gou zhen di tan", + "language": [ + { + "id": "http://vocab.getty.edu/language/zh-latn-pinyin-x-notone", + "type": "Language", + "_label": "zh-latn-pinyin-x-notone" + } + ] + } + ], + "content": "a bu na ji gou zhen di tan", + "classified_as": [ + { + "id": "http://vocab.getty.edu/term/type/UsedForTerm", + "type": "Type", + "_label": "Used for Term" + }, + { + "id": "http://vocab.getty.edu/term/POS/NeuterAdjectival", + "type": "Type", + "_label": "neuter adjectival" + } + ], + "referred_to_by": [ + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000822695-source-2000079740", + "type": "Name", + "content": "Academia Sinica (Academia Sinica; Nankang, Taiwan). Formerly TELDAP. (2014-)", + "identifies": "http://vocab.getty.edu/aat/source/2000079740", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000822695-contributor-10000250", + "type": "Name", + "content": "Academia Sinica (Nankang, Taiwan)", + "identifies": "http://vocab.getty.edu/aat/contrib/10000250", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + } + ], + "language": [ + { + "id": "http://vocab.getty.edu/language/zh-latn-pinyin-x-notone", + "type": "Language", + "_label": "zh-latn-pinyin-x-notone" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/term/1000822697-zh-Latn-wadegile", + "type": "Name", + "alternative": [ + { + "id": "http://vocab.getty.edu/aat/300187008#qualified-1000822697-zh-latn-wadegile", + "type": "Name", + "content": "a pu na chi kou chen ti t'an", + "language": [ + { + "id": "http://vocab.getty.edu/language/zh-latn-wadegile", + "type": "Language", + "_label": "zh-latn-wadegile" + } + ] + } + ], + "content": "a pu na chi kou chen ti t'an", + "classified_as": [ + { + "id": "http://vocab.getty.edu/term/type/UsedForTerm", + "type": "Type", + "_label": "Used for Term" + }, + { + "id": "http://vocab.getty.edu/term/POS/NeuterAdjectival", + "type": "Type", + "_label": "neuter adjectival" + } + ], + "referred_to_by": [ + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000822697-source-2000079740", + "type": "Name", + "content": "Academia Sinica (Academia Sinica; Nankang, Taiwan). Formerly TELDAP. (2014-)", + "identifies": "http://vocab.getty.edu/aat/source/2000079740", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000822697-contributor-10000250", + "type": "Name", + "content": "Academia Sinica (Nankang, Taiwan)", + "identifies": "http://vocab.getty.edu/aat/contrib/10000250", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + } + ], + "language": [ + { + "id": "http://vocab.getty.edu/language/zh-latn-wadegile", + "type": "Language", + "_label": "zh-latn-wadegile" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/term/1000496474-nl", + "type": "Name", + "alternative": [ + { + "id": "http://vocab.getty.edu/aat/300187008#qualified-1000496474-nl", + "type": "Name", + "content": "Abnakee kleden", + "language": [ + { + "id": "http://vocab.getty.edu/language/nl", + "type": "Language", + "_label": "nl" + } + ] + } + ], + "content": "Abnakee kleden", + "classified_as": [ + { + "id": "http://vocab.getty.edu/term/type/Descriptor", + "type": "Type", + "_label": "Descriptor" + }, + { + "id": "http://vocab.getty.edu/term/POS/PluralNoun", + "type": "Type", + "_label": "Plural Noun" + } + ], + "referred_to_by": [ + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000496474-source-2000113770", + "type": "Name", + "content": "AAT Ned: Dutch AAT Translation Project coordinated by RKD (Netherlands Institute for Art History). The Hague, Bureau AAT, 1994-.", + "identifies": "http://vocab.getty.edu/aat/source/2000113770", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000496474-contributor-10000000", + "type": "Name", + "content": "Getty Vocabulary Program", + "identifies": "http://vocab.getty.edu/aat/contrib/10000000", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000496474-contributor-10000205", + "type": "Name", + "content": "Netherlands Institute for Art History (RKD, The Hague) and the Royal Institute for Cultural Heritage (Brussels); Dutch translation collaboration between the Netherlands and Flanders", + "identifies": "http://vocab.getty.edu/aat/contrib/10000205", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + } + ], + "language": [ + { + "id": "http://vocab.getty.edu/language/nl", + "type": "Language", + "_label": "nl" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/term/1000569847-es", + "type": "Name", + "alternative": [ + { + "id": "http://vocab.getty.edu/aat/300187008#qualified-1000569847-es", + "type": "Name", + "content": "alfombras abnakee", + "language": [ + { + "id": "http://vocab.getty.edu/language/es", + "type": "Language", + "_label": "es" + } + ] + } + ], + "content": "alfombras abnakee", + "classified_as": [ + { + "id": "http://vocab.getty.edu/term/type/Descriptor", + "type": "Type", + "_label": "Descriptor" + }, + { + "id": "http://vocab.getty.edu/term/POS/PluralNoun", + "type": "Type", + "_label": "Plural Noun" + } + ], + "referred_to_by": [ + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000569847-source-2000051034", + "type": "Name", + "content": "Tesauro de Arte & Arquitectura database. Centro de Documentación de Bienes Patrimoniales, DIBAM. Santiago, Chile: 2000-. ", + "identifies": "http://vocab.getty.edu/aat/source/2000051034", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000569847-contributor-10000000", + "type": "Name", + "content": "Getty Vocabulary Program", + "identifies": "http://vocab.getty.edu/aat/contrib/10000000", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000569847-contributor-10000131", + "type": "Name", + "content": "Centro de Documentación de Bienes Patrimoniales (Servicio Nacional del Patrimonio Cultural, Ministerio de las Culturas las Artes y el Patrimonio; Santiago, Chile)", + "identifies": "http://vocab.getty.edu/aat/contrib/10000131", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + } + ], + "language": [ + { + "id": "http://vocab.getty.edu/language/es", + "type": "Language", + "_label": "es" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/term/1000292746-en", + "type": "Name", + "alternative": [ + { + "id": "http://vocab.getty.edu/aat/300187008#qualified-1000292746-en", + "type": "Name", + "content": "Abnakee rug", + "language": [ + { + "id": "http://vocab.getty.edu/language/en", + "type": "Language", + "_label": "en" + } + ] + } + ], + "content": "Abnakee rug", + "classified_as": [ + { + "id": "http://vocab.getty.edu/term/type/AlternateDescriptor", + "type": "Type", + "_label": "Alternate Descriptor" + }, + { + "id": "http://vocab.getty.edu/term/POS/SingularNoun", + "type": "Type", + "_label": "Singular Noun" + } + ], + "referred_to_by": [ + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000292746-source-2000094828", + "type": "Name", + "content": "Getty Vocabulary Program. Term warranted by Getty Vocabularies Editorial Guidelines. http://www.getty.edu/research/tools/vocabularies/guidelines/index.html", + "identifies": "http://vocab.getty.edu/aat/source/2000094828", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000292746-contributor-10000000", + "type": "Name", + "content": "Getty Vocabulary Program", + "identifies": "http://vocab.getty.edu/aat/contrib/10000000", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + } + ], + "language": [ + { + "id": "http://vocab.getty.edu/language/en", + "type": "Language", + "_label": "en" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/term/1000187010-en", + "type": "Name", + "alternative": [ + { + "id": "http://vocab.getty.edu/aat/300187008#qualified-1000187010-en", + "type": "Name", + "content": "Abnakee hooked rugs", + "language": [ + { + "id": "http://vocab.getty.edu/language/en", + "type": "Language", + "_label": "en" + } + ] + } + ], + "content": "Abnakee hooked rugs", + "classified_as": [ + { + "id": "http://vocab.getty.edu/term/type/UsedForTerm", + "type": "Type", + "_label": "Used for Term" + }, + { + "id": "http://vocab.getty.edu/term/POS/Noun", + "type": "Type", + "_label": "Noun" + } + ], + "referred_to_by": [ + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000187010-source-2000002601", + "type": "Name", + "content": "Rosenstiel, Helene von. American Rugs and Carpets: From the Seventeenth Century to Modern Times. New York: William Morrow & Co., 1978.", + "identifies": "http://vocab.getty.edu/aat/source/2000002601", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000187010-contributor-10000000", + "type": "Name", + "content": "Getty Vocabulary Program", + "identifies": "http://vocab.getty.edu/aat/contrib/10000000", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000187010-source-2000024051", + "type": "Name", + "content": "Kopp, Joel and Kate Kopp. American Hooked and Sewn Rugs: Folk Art Underfoot. 2d ed. New York: E. P. Dutton & Co., 1985.", + "identifies": "http://vocab.getty.edu/aat/source/2000024051", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + } + ], + "language": [ + { + "id": "http://vocab.getty.edu/language/en", + "type": "Language", + "_label": "en" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/term/1000187011-en", + "type": "Name", + "alternative": [ + { + "id": "http://vocab.getty.edu/aat/300187008#qualified-1000187011-en", + "type": "Name", + "content": "Abnaki rugs", + "language": [ + { + "id": "http://vocab.getty.edu/language/en", + "type": "Language", + "_label": "en" + } + ] + } + ], + "content": "Abnaki rugs", + "classified_as": [ + { + "id": "http://vocab.getty.edu/term/type/UsedForTerm", + "type": "Type", + "_label": "Used for Term" + }, + { + "id": "http://vocab.getty.edu/term/POS/Noun", + "type": "Type", + "_label": "Noun" + } + ], + "referred_to_by": [ + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000187011-source-2000094828", + "type": "Name", + "content": "Getty Vocabulary Program. Term warranted by Getty Vocabularies Editorial Guidelines. http://www.getty.edu/research/tools/vocabularies/guidelines/index.html", + "identifies": "http://vocab.getty.edu/aat/source/2000094828", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000187011-contributor-10000000", + "type": "Name", + "content": "Getty Vocabulary Program", + "identifies": "http://vocab.getty.edu/aat/contrib/10000000", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + } + ], + "language": [ + { + "id": "http://vocab.getty.edu/language/en", + "type": "Language", + "_label": "en" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/term/1000187017-en", + "type": "Name", + "alternative": [ + { + "id": "http://vocab.getty.edu/aat/300187008#qualified-1000187017-en", + "type": "Name", + "content": "hooked rugs, Abnakee", + "language": [ + { + "id": "http://vocab.getty.edu/language/en", + "type": "Language", + "_label": "en" + } + ] + } + ], + "content": "hooked rugs, Abnakee", + "classified_as": [ + { + "id": "http://vocab.getty.edu/term/type/UsedForTerm", + "type": "Type", + "_label": "Used for Term" + }, + { + "id": "http://vocab.getty.edu/term/POS/Noun", + "type": "Type", + "_label": "Noun" + } + ], + "referred_to_by": [ + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000187017-source-2000094828", + "type": "Name", + "content": "Getty Vocabulary Program. Term warranted by Getty Vocabularies Editorial Guidelines. http://www.getty.edu/research/tools/vocabularies/guidelines/index.html", + "identifies": "http://vocab.getty.edu/aat/source/2000094828", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000187017-contributor-10000000", + "type": "Name", + "content": "Getty Vocabulary Program", + "identifies": "http://vocab.getty.edu/aat/contrib/10000000", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + } + ], + "language": [ + { + "id": "http://vocab.getty.edu/language/en", + "type": "Language", + "_label": "en" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/term/1000187014-en", + "type": "Name", + "alternative": [ + { + "id": "http://vocab.getty.edu/aat/300187008#qualified-1000187014-en", + "type": "Name", + "content": "rugs, Abnakee", + "language": [ + { + "id": "http://vocab.getty.edu/language/en", + "type": "Language", + "_label": "en" + } + ] + } + ], + "content": "rugs, Abnakee", + "classified_as": [ + { + "id": "http://vocab.getty.edu/term/type/UsedForTerm", + "type": "Type", + "_label": "Used for Term" + }, + { + "id": "http://vocab.getty.edu/term/POS/Noun", + "type": "Type", + "_label": "Noun" + } + ], + "referred_to_by": [ + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000187014-source-2000094828", + "type": "Name", + "content": "Getty Vocabulary Program. Term warranted by Getty Vocabularies Editorial Guidelines. http://www.getty.edu/research/tools/vocabularies/guidelines/index.html", + "identifies": "http://vocab.getty.edu/aat/source/2000094828", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000187014-contributor-10000000", + "type": "Name", + "content": "Getty Vocabulary Program", + "identifies": "http://vocab.getty.edu/aat/contrib/10000000", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + } + ], + "language": [ + { + "id": "http://vocab.getty.edu/language/en", + "type": "Language", + "_label": "en" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/term/1000249027-en", + "type": "Name", + "alternative": [ + { + "id": "http://vocab.getty.edu/aat/300187008#qualified-1000249027-en", + "type": "Name", + "content": "rugs, Abnakee hooked", + "language": [ + { + "id": "http://vocab.getty.edu/language/en", + "type": "Language", + "_label": "en" + } + ] + } + ], + "content": "rugs, Abnakee hooked", + "classified_as": [ + { + "id": "http://vocab.getty.edu/term/type/UsedForTerm", + "type": "Type", + "_label": "Used for Term" + }, + { + "id": "http://vocab.getty.edu/term/POS/Noun", + "type": "Type", + "_label": "Noun" + } + ], + "referred_to_by": [ + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000249027-source-2000094828", + "type": "Name", + "content": "Getty Vocabulary Program. Term warranted by Getty Vocabularies Editorial Guidelines. http://www.getty.edu/research/tools/vocabularies/guidelines/index.html", + "identifies": "http://vocab.getty.edu/aat/source/2000094828", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000249027-contributor-10000000", + "type": "Name", + "content": "Getty Vocabulary Program", + "identifies": "http://vocab.getty.edu/aat/contrib/10000000", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + } + ], + "language": [ + { + "id": "http://vocab.getty.edu/language/en", + "type": "Language", + "_label": "en" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/term/1000187013-en", + "type": "Name", + "alternative": [ + { + "id": "http://vocab.getty.edu/aat/300187008#qualified-1000187013-en", + "type": "Name", + "content": "rugs, Abnaki", + "language": [ + { + "id": "http://vocab.getty.edu/language/en", + "type": "Language", + "_label": "en" + } + ] + } + ], + "content": "rugs, Abnaki", + "classified_as": [ + { + "id": "http://vocab.getty.edu/term/type/UsedForTerm", + "type": "Type", + "_label": "Used for Term" + }, + { + "id": "http://vocab.getty.edu/term/POS/Noun", + "type": "Type", + "_label": "Noun" + } + ], + "referred_to_by": [ + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000187013-source-2000094828", + "type": "Name", + "content": "Getty Vocabulary Program. Term warranted by Getty Vocabularies Editorial Guidelines. http://www.getty.edu/research/tools/vocabularies/guidelines/index.html", + "identifies": "http://vocab.getty.edu/aat/source/2000094828", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000187013-contributor-10000000", + "type": "Name", + "content": "Getty Vocabulary Program", + "identifies": "http://vocab.getty.edu/aat/contrib/10000000", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + } + ], + "language": [ + { + "id": "http://vocab.getty.edu/language/en", + "type": "Language", + "_label": "en" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/term/1000822694-zh-Hant", + "type": "Name", + "alternative": [ + { + "id": "http://vocab.getty.edu/aat/300187008#qualified-1000822694-zh-hant", + "type": "Name", + "content": "阿布納基毯", + "language": [ + { + "id": "http://vocab.getty.edu/language/zh-hant", + "type": "Language", + "_label": "zh-hant" + } + ] + } + ], + "content": "阿布納基毯", + "classified_as": [ + { + "id": "http://vocab.getty.edu/term/type/UsedForTerm", + "type": "Type", + "_label": "Used for Term" + }, + { + "id": "http://vocab.getty.edu/term/POS/NeuterAdjectival", + "type": "Type", + "_label": "neuter adjectival" + } + ], + "referred_to_by": [ + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000822694-source-2000079740", + "type": "Name", + "content": "Academia Sinica (Academia Sinica; Nankang, Taiwan). Formerly TELDAP. (2014-)", + "identifies": "http://vocab.getty.edu/aat/source/2000079740", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000822694-contributor-10000250", + "type": "Name", + "content": "Academia Sinica (Nankang, Taiwan)", + "identifies": "http://vocab.getty.edu/aat/contrib/10000250", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + } + ], + "language": [ + { + "id": "http://vocab.getty.edu/language/zh-hant", + "type": "Language", + "_label": "zh-hant" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/term/1000496475-nl", + "type": "Name", + "alternative": [ + { + "id": "http://vocab.getty.edu/aat/300187008#qualified-1000496475-nl", + "type": "Name", + "content": "Abnakee kleed", + "language": [ + { + "id": "http://vocab.getty.edu/language/nl", + "type": "Language", + "_label": "nl" + } + ] + } + ], + "content": "Abnakee kleed", + "classified_as": [ + { + "id": "http://vocab.getty.edu/term/type/AlternateDescriptor", + "type": "Type", + "_label": "Alternate Descriptor" + }, + { + "id": "http://vocab.getty.edu/term/POS/SingularNoun", + "type": "Type", + "_label": "Singular Noun" + } + ], + "referred_to_by": [ + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000496475-source-2000113770", + "type": "Name", + "content": "AAT Ned: Dutch AAT Translation Project coordinated by RKD (Netherlands Institute for Art History). The Hague, Bureau AAT, 1994-.", + "identifies": "http://vocab.getty.edu/aat/source/2000113770", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000496475-contributor-10000000", + "type": "Name", + "content": "Getty Vocabulary Program", + "identifies": "http://vocab.getty.edu/aat/contrib/10000000", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000496475-contributor-10000205", + "type": "Name", + "content": "Netherlands Institute for Art History (RKD, The Hague) and the Royal Institute for Cultural Heritage (Brussels); Dutch translation collaboration between the Netherlands and Flanders", + "identifies": "http://vocab.getty.edu/aat/contrib/10000205", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + } + ], + "language": [ + { + "id": "http://vocab.getty.edu/language/nl", + "type": "Language", + "_label": "nl" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/term/1000442929-es", + "type": "Name", + "alternative": [ + { + "id": "http://vocab.getty.edu/aat/300187008#qualified-1000442929-es", + "type": "Name", + "content": "alfombra abnakee", + "language": [ + { + "id": "http://vocab.getty.edu/language/es", + "type": "Language", + "_label": "es" + } + ] + } + ], + "content": "alfombra abnakee", + "classified_as": [ + { + "id": "http://vocab.getty.edu/term/type/AlternateDescriptor", + "type": "Type", + "_label": "Alternate Descriptor" + }, + { + "id": "http://vocab.getty.edu/term/POS/SingularNoun", + "type": "Type", + "_label": "Singular Noun" + } + ], + "referred_to_by": [ + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000442929-source-2000051034", + "type": "Name", + "content": "Tesauro de Arte & Arquitectura database. Centro de Documentación de Bienes Patrimoniales, DIBAM. Santiago, Chile: 2000-. ", + "identifies": "http://vocab.getty.edu/aat/source/2000051034", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311936", + "type": "Type", + "_label": "primary sources" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000442929-contributor-10000000", + "type": "Name", + "content": "Getty Vocabulary Program", + "identifies": "http://vocab.getty.edu/aat/contrib/10000000", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008#term-1000442929-contributor-10000131", + "type": "Name", + "content": "Centro de Documentación de Bienes Patrimoniales (Servicio Nacional del Patrimonio Cultural, Ministerio de las Culturas las Artes y el Patrimonio; Santiago, Chile)", + "identifies": "http://vocab.getty.edu/aat/contrib/10000131", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300403974", + "type": "Type", + "_label": "contributors" + } + ] + } + ], + "language": [ + { + "id": "http://vocab.getty.edu/language/es", + "type": "Language", + "_label": "es" + } + ] + }, + { + "id": "http://vocab.getty.edu/aat/300187008", + "type": "Identifier", + "content": "300187008", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300404629", + "type": "Type", + "_label": "Getty Vocabularies Identifier" + } + ] + } + ], + "_label": "Abnakee rugs", + "rdfs:seeAlso": [ + { + "id": "http://vocab.getty.edu/aat/aggregations/300187008/cross_referenced", + "type": "http://www.openarchives.org/ore/terms/Aggregation", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300311741", + "type": "Type", + "_label": "cross-references" + } + ], + "http://www.openarchives.org/ore/terms/aggregates": [ + { + "id": "http://vocab.getty.edu/aat/300311741" + }, + { + "id": "http://vocab.getty.edu/aat/300311936" + }, + { + "id": "http://vocab.getty.edu/aat/300403974" + }, + { + "id": "http://vocab.getty.edu/term/type/Descriptor" + }, + { + "id": "http://vocab.getty.edu/term/POS/PluralNoun" + }, + { + "id": "http://vocab.getty.edu/term/POS/NeuterAdjectival" + }, + { + "id": "http://vocab.getty.edu/term/type/UsedForTerm" + }, + { + "id": "http://vocab.getty.edu/term/type/AlternateDescriptor" + }, + { + "id": "http://vocab.getty.edu/term/POS/SingularNoun" + }, + { + "id": "http://vocab.getty.edu/term/POS/Noun" + } + ], + "_label": "Internal cross-references" + }, + { + "id": "http://vocab.getty.edu/aat/aggregations/300187008/hierarchy", + "type": "http://www.openarchives.org/ore/terms/Aggregation", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300417471", + "type": "Type", + "_label": "ancestor" + }, + { + "id": "http://vocab.getty.edu/aat/300417475", + "type": "Type", + "_label": "child" + } + ], + "_label": "ancestors and children" + }, + { + "id": "http://vocab.getty.edu/aat/aggregations/300187008/related", + "type": "http://www.openarchives.org/ore/terms/Aggregation", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/300417473", + "type": "Type", + "_label": "related concepts" + } + ], + "_label": "related concepts" + } + ], + "broader": [ + { + "id": "http://vocab.getty.edu/aat/300186946", + "type": "Type", + "_label": "" + } + ], + "skos:inScheme": { + "id": "http://vocab.getty.edu/aat/" + }, + "la:related_from_by": { + "id": "http://vocab.getty.edu/aat/relationships/2427-300187008-300053633", + "type": "la:Relationship", + "classified_as": [ + { + "id": "http://vocab.getty.edu/aat/relationships/2427", + "type": "Type", + "_label": "produced by - activity/event/process" + } + ], + "la:relates_to": { + "id": "http://vocab.getty.edu/aat/300053633" + } + } +} \ No newline at end of file From 4a4e976c1b021cd916d46c27ae5f1f0beafcdec3 Mon Sep 17 00:00:00 2001 From: jo-pol Date: Thu, 1 May 2025 15:04:41 +0200 Subject: [PATCH 032/470] AAT value from https://vocabs.datastations.nl/rest/v1/AATC/data?uri=http%3A%2F%2Fvocab.getty.edu%2Faat%2F300187008&format=application/ld%2Bjson --- ...setFieldServiceBeanFilterResponseTest.java | 29 +- .../cvoc-dans-config/AATClassification.json | 14 +- .../cvoc-dans-value/AATClassification.json | 1532 +---------------- 3 files changed, 68 insertions(+), 1507 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java index de199b95a97..aa5fed0650f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java @@ -13,8 +13,6 @@ import java.io.FileReader; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.Map; -import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; @@ -55,8 +53,8 @@ void audience() throws Exception { JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); assertThat(result.getString("@id")).isEqualTo(termURI); - assertThat(geDutchValue(result.get("vocabularyName"))).startsWith("Classificatiecodes van de wetenschapsportal Narcis (www.narcis.nl)."); - assertThat(geDutchValue(result.get("termName"))).startsWith("Theoretische chemie, kwantumchemie"); + assertThat(getValue("nl", result.get("vocabularyName"))).startsWith("Classificatiecodes van de wetenschapsportal Narcis (www.narcis.nl)."); + assertThat(getValue("nl", result.get("termName"))).startsWith("Theoretische chemie, kwantumchemie"); assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } @@ -69,8 +67,8 @@ void collection() throws Exception { JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); assertThat(result.getString("@id")).isEqualTo(termURI); - assertThat(geDutchValue(result.get("vocabularyName"))).isEqualTo("DansCollections"); - assertThat(geDutchValue(result.get("termName"))).isEqualTo("ArcheoDepot"); + assertThat(getValue("nl", result.get("vocabularyName"))).isEqualTo("DansCollections"); + assertThat(getValue("nl", result.get("termName"))).isEqualTo("ArcheoDepot"); assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } @@ -83,7 +81,8 @@ void aatClassification() throws Exception { JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); assertThat(result.getString("@id")).isEqualTo(termURI); - assertThat(geDutchValue(result.get("termName"))).isEqualTo("Abnakee rugs"); + assertThat(getValue("en", result.get("vocabularyName"))).isEqualTo("The Art and Architecture Thesaurus Concepts"); + assertThat(result.getString("termName")).isEqualTo("Abnakee kleden"); assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } @@ -97,7 +96,7 @@ void abrPeriod() throws Exception { assertThat(result.getString("@id")).isEqualTo(termURI); assertThat(result.getString("vocabularyName")).isEqualTo("ABR perioden"); - assertThat(geDutchValue(result.get("termName"))).isEqualTo("Vroege Middeleeuwen D"); + assertThat(getValue("nl", result.get("termName"))).isEqualTo("Vroege Middeleeuwen D"); assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } @@ -111,7 +110,7 @@ void abrArtifact() throws Exception { assertThat(result.getString("@id")).isEqualTo(termURI); assertThat(result.getString("vocabularyName")).isEqualTo("ABR artifact"); - assertThat(geDutchValue(result.get("termName"))).isEqualTo("steen"); + assertThat(getValue("nl", result.get("termName"))).isEqualTo("steen"); assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } @@ -125,7 +124,7 @@ void abrVerwervingswijze() throws Exception { assertThat(result.getString("@id")).isEqualTo(termURI); assertThat(result.getString("vocabularyName")).isEqualTo("ABR verwervingswijzen"); - assertThat(geDutchValue(result.get("termName"))).isEqualTo("archeologisch: booronderzoek"); + assertThat(getValue("nl", result.get("termName"))).isEqualTo("archeologisch: booronderzoek"); assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } @@ -139,7 +138,7 @@ void abrRapportType() throws Exception { assertThat(result.getString("@id")).isEqualTo(termURI); assertThat(result.getString("vocabularyName")).isEqualTo("ABR rapporten"); - assertThat(geDutchValue(result.get("termName"))).isEqualTo("Achterhoekse Archeologische Publicaties"); + assertThat(getValue("nl", result.get("termName"))).isEqualTo("Achterhoekse Archeologische Publicaties"); assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } @@ -152,20 +151,20 @@ void abrComplex() throws Exception { JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); assertThat(result.getString("@id")).isEqualTo(termURI); assertThat(result.getString("vocabularyName")).isEqualTo("ABR complextypen"); - assertThat(geDutchValue(result.get("termName"))).isEqualTo("(ring)walburg"); + assertThat(getValue("nl", result.get("termName"))).isEqualTo("(ring)walburg"); assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } - private String geDutchValue(JsonValue values) { + private String getValue(String nl, JsonValue values) { if (values instanceof JsonArray) { for (var item : (JsonArray) values) { JsonObject obj = item.asJsonObject(); - if ("nl".equals(obj.getString("lang", ""))) { + if (nl.equals(obj.getString("lang", ""))) { return obj.getString("value"); } } } else if (values instanceof JsonObject) { JsonObject obj = (JsonObject) values; - if ("nl".equals(obj.getString("lang", ""))) { + if (nl.equals(obj.getString("lang", ""))) { return obj.getString("value"); } } diff --git a/src/test/resources/json/cvoc-dans-config/AATClassification.json b/src/test/resources/json/cvoc-dans-config/AATClassification.json index c6ee9357576..f03e24c379d 100644 --- a/src/test/resources/json/cvoc-dans-config/AATClassification.json +++ b/src/test/resources/json/cvoc-dans-config/AATClassification.json @@ -2,7 +2,7 @@ "field-name": "dansAATClassification", "term-uri-field": "dansAATClassification", "cvoc-url": "https://dev.vocabs.datastations.nl/", - "js-url": "/custom/skosmos.js", + "js-url": "https://github.com/gdcc/dataverse-external-vocab-support/blob/main/scripts/skosmos.js", "protocol": "skosmos", "retrieval-uri": "https://dev.vocabs.datastations.nl/rest/v1/data?uri={0}", "term-parent-uri": "", @@ -36,8 +36,16 @@ ] }, "vocabularyName": { - "pattern": "Art & Architecture Thesaurus", - "params": [] + "pattern": "{0}", + "params": [ + "/graph/type=skos:ConceptScheme/label" + ] + }, + "vocabularyUri": { + "pattern": "{0}", + "params": [ + "/graph/type=skos:ConceptScheme/uri" + ] } } } diff --git a/src/test/resources/json/cvoc-dans-value/AATClassification.json b/src/test/resources/json/cvoc-dans-value/AATClassification.json index 9a2d81a0f8a..787bb0f3663 100644 --- a/src/test/resources/json/cvoc-dans-value/AATClassification.json +++ b/src/test/resources/json/cvoc-dans-value/AATClassification.json @@ -1,1501 +1,55 @@ { - "@context": "https://linked.art/ns/v1/linked-art.json", - "id": "http://vocab.getty.edu/aat/300187008", - "type": "Type", - "subject_of": [ - { - "id": "http://vocab.getty.edu/aat/scopeNote/38789", - "type": "LinguisticObject", - "content": "Hooked rugs popular in the early 20th century with designs inspired by Native American rug motifs.", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300435416", - "type": "Type", - "_label": "descriptive note" - } - ], - "referred_to_by": [ - { - "id": "http://vocab.getty.edu/aat/300187008#description-300187008-source-2000099620", - "type": "Name", - "content": "Legacy Art & Architecture Thesaurus (AAT) data. Compiled without citing sources. Warranted by AAT staff. 1983-1995. ", - "identifies": "http://vocab.getty.edu/aat/source/2000099620", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#description-300187008-contributor-10000000", - "type": "Name", - "content": "Getty Vocabulary Program", - "identifies": "http://vocab.getty.edu/aat/contrib/10000000", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - } - ], - "language": [ - { - "id": "http://vocab.getty.edu/language/en", - "type": "Language", - "_label": "en" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/scopeNote/91823", - "type": "LinguisticObject", - "content": "Gehaakte tapijten die populair waren in het begin van de twintigste eeuw en bestaan uit een ontwerp dat is geïnspireerd op motieven van tapijten van de oorspronkelijke inwoners van Amerika.", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300435416", - "type": "Type", - "_label": "descriptive note" - } - ], - "referred_to_by": [ - { - "id": "http://vocab.getty.edu/aat/300187008#description-300187008-source-2000113770", - "type": "Name", - "content": "AAT Ned: Dutch AAT Translation Project coordinated by RKD (Netherlands Institute for Art History). The Hague, Bureau AAT, 1994-.", - "identifies": "http://vocab.getty.edu/aat/source/2000113770", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#description-300187008-contributor-10000205", - "type": "Name", - "content": "Netherlands Institute for Art History (RKD, The Hague) and the Royal Institute for Cultural Heritage (Brussels); Dutch translation collaboration between the Netherlands and Flanders", - "identifies": "http://vocab.getty.edu/aat/contrib/10000205", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - } - ], - "language": [ - { - "id": "http://vocab.getty.edu/language/nl", - "type": "Language", - "_label": "nl" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/scopeNote/73530", - "type": "LinguisticObject", - "content": "Tapices hechos con ganchillo populares a comienzos del siglo XX con diseños inspirados por los motivos de los tapices nativos americanos.", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300435416", - "type": "Type", - "_label": "descriptive note" - } - ], - "referred_to_by": [ - { - "id": "http://vocab.getty.edu/aat/300187008#description-300187008-source-2000051034", - "type": "Name", - "content": "Tesauro de Arte & Arquitectura database. Centro de Documentación de Bienes Patrimoniales, DIBAM. Santiago, Chile: 2000-. ", - "identifies": "http://vocab.getty.edu/aat/source/2000051034", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#description-300187008-contributor-10000131", - "type": "Name", - "content": "Centro de Documentación de Bienes Patrimoniales (Servicio Nacional del Patrimonio Cultural, Ministerio de las Culturas las Artes y el Patrimonio; Santiago, Chile)", - "identifies": "http://vocab.getty.edu/aat/contrib/10000131", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - } - ], - "language": [ - { - "id": "http://vocab.getty.edu/language/es", - "type": "Language", - "_label": "es" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/scopeNote/151329", - "type": "LinguisticObject", - "content": "流行於二十世紀早期的鉤針地毯,設計靈感來自美洲原住民的地毯圖案。", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300435416", - "type": "Type", - "_label": "descriptive note" - } - ], - "referred_to_by": [ - { - "id": "http://vocab.getty.edu/aat/300187008#description-300187008-source-2000079740", - "type": "Name", - "content": "Academia Sinica (Academia Sinica; Nankang, Taiwan). Formerly TELDAP. (2014-)", - "identifies": "http://vocab.getty.edu/aat/source/2000079740", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#description-300187008-contributor-10000250", - "type": "Name", - "content": "Academia Sinica (Nankang, Taiwan)", - "identifies": "http://vocab.getty.edu/aat/contrib/10000250", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - } - ], - "language": [ - { - "id": "http://vocab.getty.edu/language/zh-hant", - "type": "Language", - "_label": "zh-hant" - } - ] - } - ], - "identified_by": [ - { - "id": "http://vocab.getty.edu/aat/term/1000187008-en", - "type": "Name", - "alternative": [ - { - "id": "http://vocab.getty.edu/aat/300187008#qualified-1000187008-en", - "type": "Name", - "content": "Abnakee rugs", - "language": [ - { - "id": "http://vocab.getty.edu/language/en", - "type": "Language", - "_label": "en" - } - ] - } - ], - "content": "Abnakee rugs", - "classified_as": [ - { - "id": "http://vocab.getty.edu/term/type/Descriptor", - "type": "Type", - "_label": "Descriptor" - }, - { - "id": "http://vocab.getty.edu/term/POS/PluralNoun", - "type": "Type", - "_label": "Plural Noun" - }, - { - "id": "http://vocab.getty.edu/aat/300404670", - "type": "Type", - "_label": "preferred term" - } - ], - "referred_to_by": [ - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000187008-source-2000046658", - "type": "Name", - "content": "Antiques. New York: Straight Enterprises, 1922-.", - "identifies": "http://vocab.getty.edu/aat/source/2000046658", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000187008-contributor-10000000", - "type": "Name", - "content": "Getty Vocabulary Program", - "identifies": "http://vocab.getty.edu/aat/contrib/10000000", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - } - ], - "language": [ - { - "id": "http://vocab.getty.edu/language/en", - "type": "Language", - "_label": "en" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/term/1000822693-zh-Hant", - "type": "Name", - "alternative": [ - { - "id": "http://vocab.getty.edu/aat/300187008#qualified-1000822693-zh-hant", - "type": "Name", - "content": "阿布納基鉤針地毯", - "language": [ - { - "id": "http://vocab.getty.edu/language/zh-hant", - "type": "Language", - "_label": "zh-hant" - } - ] - } - ], - "content": "阿布納基鉤針地毯", - "classified_as": [ - { - "id": "http://vocab.getty.edu/term/type/Descriptor", - "type": "Type", - "_label": "Descriptor" - }, - { - "id": "http://vocab.getty.edu/term/POS/NeuterAdjectival", - "type": "Type", - "_label": "neuter adjectival" - } - ], - "referred_to_by": [ - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000822693-source-2000079740", - "type": "Name", - "content": "Academia Sinica (Academia Sinica; Nankang, Taiwan). Formerly TELDAP. (2014-)", - "identifies": "http://vocab.getty.edu/aat/source/2000079740", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000822693-contributor-10000250", - "type": "Name", - "content": "Academia Sinica (Nankang, Taiwan)", - "identifies": "http://vocab.getty.edu/aat/contrib/10000250", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - } - ], - "language": [ - { - "id": "http://vocab.getty.edu/language/zh-hant", - "type": "Language", - "_label": "zh-hant" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/term/1000822696-zh-Latn-pinyin-x-hanyu", - "type": "Name", - "alternative": [ - { - "id": "http://vocab.getty.edu/aat/300187008#qualified-1000822696-zh-latn-pinyin-x-hanyu", - "type": "Name", - "content": "ā bù nà jī gōu zhēn dì tǎn", - "language": [ - { - "id": "http://vocab.getty.edu/language/zh-latn-pinyin-x-hanyu", - "type": "Language", - "_label": "zh-latn-pinyin-x-hanyu" - } - ] - } - ], - "content": "ā bù nà jī gōu zhēn dì tǎn", - "classified_as": [ - { - "id": "http://vocab.getty.edu/term/type/UsedForTerm", - "type": "Type", - "_label": "Used for Term" - }, - { - "id": "http://vocab.getty.edu/term/POS/NeuterAdjectival", - "type": "Type", - "_label": "neuter adjectival" - } - ], - "referred_to_by": [ - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000822696-source-2000079740", - "type": "Name", - "content": "Academia Sinica (Academia Sinica; Nankang, Taiwan). Formerly TELDAP. (2014-)", - "identifies": "http://vocab.getty.edu/aat/source/2000079740", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000822696-contributor-10000250", - "type": "Name", - "content": "Academia Sinica (Nankang, Taiwan)", - "identifies": "http://vocab.getty.edu/aat/contrib/10000250", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - } - ], - "language": [ - { - "id": "http://vocab.getty.edu/language/zh-latn-pinyin-x-hanyu", - "type": "Language", - "_label": "zh-latn-pinyin-x-hanyu" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/term/1000822695-zh-Latn-pinyin-x-notone", - "type": "Name", - "alternative": [ - { - "id": "http://vocab.getty.edu/aat/300187008#qualified-1000822695-zh-latn-pinyin-x-notone", - "type": "Name", - "content": "a bu na ji gou zhen di tan", - "language": [ - { - "id": "http://vocab.getty.edu/language/zh-latn-pinyin-x-notone", - "type": "Language", - "_label": "zh-latn-pinyin-x-notone" - } - ] - } - ], - "content": "a bu na ji gou zhen di tan", - "classified_as": [ - { - "id": "http://vocab.getty.edu/term/type/UsedForTerm", - "type": "Type", - "_label": "Used for Term" - }, - { - "id": "http://vocab.getty.edu/term/POS/NeuterAdjectival", - "type": "Type", - "_label": "neuter adjectival" - } - ], - "referred_to_by": [ - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000822695-source-2000079740", - "type": "Name", - "content": "Academia Sinica (Academia Sinica; Nankang, Taiwan). Formerly TELDAP. (2014-)", - "identifies": "http://vocab.getty.edu/aat/source/2000079740", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000822695-contributor-10000250", - "type": "Name", - "content": "Academia Sinica (Nankang, Taiwan)", - "identifies": "http://vocab.getty.edu/aat/contrib/10000250", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - } - ], - "language": [ - { - "id": "http://vocab.getty.edu/language/zh-latn-pinyin-x-notone", - "type": "Language", - "_label": "zh-latn-pinyin-x-notone" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/term/1000822697-zh-Latn-wadegile", - "type": "Name", - "alternative": [ - { - "id": "http://vocab.getty.edu/aat/300187008#qualified-1000822697-zh-latn-wadegile", - "type": "Name", - "content": "a pu na chi kou chen ti t'an", - "language": [ - { - "id": "http://vocab.getty.edu/language/zh-latn-wadegile", - "type": "Language", - "_label": "zh-latn-wadegile" - } - ] - } - ], - "content": "a pu na chi kou chen ti t'an", - "classified_as": [ - { - "id": "http://vocab.getty.edu/term/type/UsedForTerm", - "type": "Type", - "_label": "Used for Term" - }, - { - "id": "http://vocab.getty.edu/term/POS/NeuterAdjectival", - "type": "Type", - "_label": "neuter adjectival" - } - ], - "referred_to_by": [ - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000822697-source-2000079740", - "type": "Name", - "content": "Academia Sinica (Academia Sinica; Nankang, Taiwan). Formerly TELDAP. (2014-)", - "identifies": "http://vocab.getty.edu/aat/source/2000079740", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000822697-contributor-10000250", - "type": "Name", - "content": "Academia Sinica (Nankang, Taiwan)", - "identifies": "http://vocab.getty.edu/aat/contrib/10000250", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - } - ], - "language": [ - { - "id": "http://vocab.getty.edu/language/zh-latn-wadegile", - "type": "Language", - "_label": "zh-latn-wadegile" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/term/1000496474-nl", - "type": "Name", - "alternative": [ - { - "id": "http://vocab.getty.edu/aat/300187008#qualified-1000496474-nl", - "type": "Name", - "content": "Abnakee kleden", - "language": [ - { - "id": "http://vocab.getty.edu/language/nl", - "type": "Language", - "_label": "nl" - } - ] - } - ], - "content": "Abnakee kleden", - "classified_as": [ - { - "id": "http://vocab.getty.edu/term/type/Descriptor", - "type": "Type", - "_label": "Descriptor" - }, - { - "id": "http://vocab.getty.edu/term/POS/PluralNoun", - "type": "Type", - "_label": "Plural Noun" - } - ], - "referred_to_by": [ - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000496474-source-2000113770", - "type": "Name", - "content": "AAT Ned: Dutch AAT Translation Project coordinated by RKD (Netherlands Institute for Art History). The Hague, Bureau AAT, 1994-.", - "identifies": "http://vocab.getty.edu/aat/source/2000113770", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000496474-contributor-10000000", - "type": "Name", - "content": "Getty Vocabulary Program", - "identifies": "http://vocab.getty.edu/aat/contrib/10000000", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000496474-contributor-10000205", - "type": "Name", - "content": "Netherlands Institute for Art History (RKD, The Hague) and the Royal Institute for Cultural Heritage (Brussels); Dutch translation collaboration between the Netherlands and Flanders", - "identifies": "http://vocab.getty.edu/aat/contrib/10000205", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - } - ], - "language": [ - { - "id": "http://vocab.getty.edu/language/nl", - "type": "Language", - "_label": "nl" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/term/1000569847-es", - "type": "Name", - "alternative": [ - { - "id": "http://vocab.getty.edu/aat/300187008#qualified-1000569847-es", - "type": "Name", - "content": "alfombras abnakee", - "language": [ - { - "id": "http://vocab.getty.edu/language/es", - "type": "Language", - "_label": "es" - } - ] - } - ], - "content": "alfombras abnakee", - "classified_as": [ - { - "id": "http://vocab.getty.edu/term/type/Descriptor", - "type": "Type", - "_label": "Descriptor" - }, - { - "id": "http://vocab.getty.edu/term/POS/PluralNoun", - "type": "Type", - "_label": "Plural Noun" - } - ], - "referred_to_by": [ - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000569847-source-2000051034", - "type": "Name", - "content": "Tesauro de Arte & Arquitectura database. Centro de Documentación de Bienes Patrimoniales, DIBAM. Santiago, Chile: 2000-. ", - "identifies": "http://vocab.getty.edu/aat/source/2000051034", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000569847-contributor-10000000", - "type": "Name", - "content": "Getty Vocabulary Program", - "identifies": "http://vocab.getty.edu/aat/contrib/10000000", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000569847-contributor-10000131", - "type": "Name", - "content": "Centro de Documentación de Bienes Patrimoniales (Servicio Nacional del Patrimonio Cultural, Ministerio de las Culturas las Artes y el Patrimonio; Santiago, Chile)", - "identifies": "http://vocab.getty.edu/aat/contrib/10000131", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - } - ], - "language": [ - { - "id": "http://vocab.getty.edu/language/es", - "type": "Language", - "_label": "es" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/term/1000292746-en", - "type": "Name", - "alternative": [ - { - "id": "http://vocab.getty.edu/aat/300187008#qualified-1000292746-en", - "type": "Name", - "content": "Abnakee rug", - "language": [ - { - "id": "http://vocab.getty.edu/language/en", - "type": "Language", - "_label": "en" - } - ] - } - ], - "content": "Abnakee rug", - "classified_as": [ - { - "id": "http://vocab.getty.edu/term/type/AlternateDescriptor", - "type": "Type", - "_label": "Alternate Descriptor" - }, - { - "id": "http://vocab.getty.edu/term/POS/SingularNoun", - "type": "Type", - "_label": "Singular Noun" - } - ], - "referred_to_by": [ - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000292746-source-2000094828", - "type": "Name", - "content": "Getty Vocabulary Program. Term warranted by Getty Vocabularies Editorial Guidelines. http://www.getty.edu/research/tools/vocabularies/guidelines/index.html", - "identifies": "http://vocab.getty.edu/aat/source/2000094828", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000292746-contributor-10000000", - "type": "Name", - "content": "Getty Vocabulary Program", - "identifies": "http://vocab.getty.edu/aat/contrib/10000000", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - } - ], - "language": [ - { - "id": "http://vocab.getty.edu/language/en", - "type": "Language", - "_label": "en" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/term/1000187010-en", - "type": "Name", - "alternative": [ - { - "id": "http://vocab.getty.edu/aat/300187008#qualified-1000187010-en", - "type": "Name", - "content": "Abnakee hooked rugs", - "language": [ - { - "id": "http://vocab.getty.edu/language/en", - "type": "Language", - "_label": "en" - } - ] - } - ], - "content": "Abnakee hooked rugs", - "classified_as": [ - { - "id": "http://vocab.getty.edu/term/type/UsedForTerm", - "type": "Type", - "_label": "Used for Term" - }, - { - "id": "http://vocab.getty.edu/term/POS/Noun", - "type": "Type", - "_label": "Noun" - } - ], - "referred_to_by": [ - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000187010-source-2000002601", - "type": "Name", - "content": "Rosenstiel, Helene von. American Rugs and Carpets: From the Seventeenth Century to Modern Times. New York: William Morrow & Co., 1978.", - "identifies": "http://vocab.getty.edu/aat/source/2000002601", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000187010-contributor-10000000", - "type": "Name", - "content": "Getty Vocabulary Program", - "identifies": "http://vocab.getty.edu/aat/contrib/10000000", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000187010-source-2000024051", - "type": "Name", - "content": "Kopp, Joel and Kate Kopp. American Hooked and Sewn Rugs: Folk Art Underfoot. 2d ed. New York: E. P. Dutton & Co., 1985.", - "identifies": "http://vocab.getty.edu/aat/source/2000024051", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - } - ], - "language": [ - { - "id": "http://vocab.getty.edu/language/en", - "type": "Language", - "_label": "en" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/term/1000187011-en", - "type": "Name", - "alternative": [ - { - "id": "http://vocab.getty.edu/aat/300187008#qualified-1000187011-en", - "type": "Name", - "content": "Abnaki rugs", - "language": [ - { - "id": "http://vocab.getty.edu/language/en", - "type": "Language", - "_label": "en" - } - ] - } - ], - "content": "Abnaki rugs", - "classified_as": [ - { - "id": "http://vocab.getty.edu/term/type/UsedForTerm", - "type": "Type", - "_label": "Used for Term" - }, - { - "id": "http://vocab.getty.edu/term/POS/Noun", - "type": "Type", - "_label": "Noun" - } - ], - "referred_to_by": [ - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000187011-source-2000094828", - "type": "Name", - "content": "Getty Vocabulary Program. Term warranted by Getty Vocabularies Editorial Guidelines. http://www.getty.edu/research/tools/vocabularies/guidelines/index.html", - "identifies": "http://vocab.getty.edu/aat/source/2000094828", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000187011-contributor-10000000", - "type": "Name", - "content": "Getty Vocabulary Program", - "identifies": "http://vocab.getty.edu/aat/contrib/10000000", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - } - ], - "language": [ - { - "id": "http://vocab.getty.edu/language/en", - "type": "Language", - "_label": "en" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/term/1000187017-en", - "type": "Name", - "alternative": [ - { - "id": "http://vocab.getty.edu/aat/300187008#qualified-1000187017-en", - "type": "Name", - "content": "hooked rugs, Abnakee", - "language": [ - { - "id": "http://vocab.getty.edu/language/en", - "type": "Language", - "_label": "en" - } - ] - } - ], - "content": "hooked rugs, Abnakee", - "classified_as": [ - { - "id": "http://vocab.getty.edu/term/type/UsedForTerm", - "type": "Type", - "_label": "Used for Term" - }, - { - "id": "http://vocab.getty.edu/term/POS/Noun", - "type": "Type", - "_label": "Noun" - } - ], - "referred_to_by": [ - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000187017-source-2000094828", - "type": "Name", - "content": "Getty Vocabulary Program. Term warranted by Getty Vocabularies Editorial Guidelines. http://www.getty.edu/research/tools/vocabularies/guidelines/index.html", - "identifies": "http://vocab.getty.edu/aat/source/2000094828", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000187017-contributor-10000000", - "type": "Name", - "content": "Getty Vocabulary Program", - "identifies": "http://vocab.getty.edu/aat/contrib/10000000", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - } - ], - "language": [ - { - "id": "http://vocab.getty.edu/language/en", - "type": "Language", - "_label": "en" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/term/1000187014-en", - "type": "Name", - "alternative": [ - { - "id": "http://vocab.getty.edu/aat/300187008#qualified-1000187014-en", - "type": "Name", - "content": "rugs, Abnakee", - "language": [ - { - "id": "http://vocab.getty.edu/language/en", - "type": "Language", - "_label": "en" - } - ] - } - ], - "content": "rugs, Abnakee", - "classified_as": [ - { - "id": "http://vocab.getty.edu/term/type/UsedForTerm", - "type": "Type", - "_label": "Used for Term" - }, - { - "id": "http://vocab.getty.edu/term/POS/Noun", - "type": "Type", - "_label": "Noun" - } - ], - "referred_to_by": [ - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000187014-source-2000094828", - "type": "Name", - "content": "Getty Vocabulary Program. Term warranted by Getty Vocabularies Editorial Guidelines. http://www.getty.edu/research/tools/vocabularies/guidelines/index.html", - "identifies": "http://vocab.getty.edu/aat/source/2000094828", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000187014-contributor-10000000", - "type": "Name", - "content": "Getty Vocabulary Program", - "identifies": "http://vocab.getty.edu/aat/contrib/10000000", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - } - ], - "language": [ - { - "id": "http://vocab.getty.edu/language/en", - "type": "Language", - "_label": "en" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/term/1000249027-en", - "type": "Name", - "alternative": [ - { - "id": "http://vocab.getty.edu/aat/300187008#qualified-1000249027-en", - "type": "Name", - "content": "rugs, Abnakee hooked", - "language": [ - { - "id": "http://vocab.getty.edu/language/en", - "type": "Language", - "_label": "en" - } - ] - } - ], - "content": "rugs, Abnakee hooked", - "classified_as": [ - { - "id": "http://vocab.getty.edu/term/type/UsedForTerm", - "type": "Type", - "_label": "Used for Term" - }, - { - "id": "http://vocab.getty.edu/term/POS/Noun", - "type": "Type", - "_label": "Noun" - } - ], - "referred_to_by": [ - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000249027-source-2000094828", - "type": "Name", - "content": "Getty Vocabulary Program. Term warranted by Getty Vocabularies Editorial Guidelines. http://www.getty.edu/research/tools/vocabularies/guidelines/index.html", - "identifies": "http://vocab.getty.edu/aat/source/2000094828", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000249027-contributor-10000000", - "type": "Name", - "content": "Getty Vocabulary Program", - "identifies": "http://vocab.getty.edu/aat/contrib/10000000", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - } - ], - "language": [ - { - "id": "http://vocab.getty.edu/language/en", - "type": "Language", - "_label": "en" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/term/1000187013-en", - "type": "Name", - "alternative": [ - { - "id": "http://vocab.getty.edu/aat/300187008#qualified-1000187013-en", - "type": "Name", - "content": "rugs, Abnaki", - "language": [ - { - "id": "http://vocab.getty.edu/language/en", - "type": "Language", - "_label": "en" - } - ] - } - ], - "content": "rugs, Abnaki", - "classified_as": [ - { - "id": "http://vocab.getty.edu/term/type/UsedForTerm", - "type": "Type", - "_label": "Used for Term" - }, - { - "id": "http://vocab.getty.edu/term/POS/Noun", - "type": "Type", - "_label": "Noun" - } - ], - "referred_to_by": [ - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000187013-source-2000094828", - "type": "Name", - "content": "Getty Vocabulary Program. Term warranted by Getty Vocabularies Editorial Guidelines. http://www.getty.edu/research/tools/vocabularies/guidelines/index.html", - "identifies": "http://vocab.getty.edu/aat/source/2000094828", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000187013-contributor-10000000", - "type": "Name", - "content": "Getty Vocabulary Program", - "identifies": "http://vocab.getty.edu/aat/contrib/10000000", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - } - ], - "language": [ - { - "id": "http://vocab.getty.edu/language/en", - "type": "Language", - "_label": "en" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/term/1000822694-zh-Hant", - "type": "Name", - "alternative": [ - { - "id": "http://vocab.getty.edu/aat/300187008#qualified-1000822694-zh-hant", - "type": "Name", - "content": "阿布納基毯", - "language": [ - { - "id": "http://vocab.getty.edu/language/zh-hant", - "type": "Language", - "_label": "zh-hant" - } - ] - } - ], - "content": "阿布納基毯", - "classified_as": [ - { - "id": "http://vocab.getty.edu/term/type/UsedForTerm", - "type": "Type", - "_label": "Used for Term" - }, - { - "id": "http://vocab.getty.edu/term/POS/NeuterAdjectival", - "type": "Type", - "_label": "neuter adjectival" - } - ], - "referred_to_by": [ - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000822694-source-2000079740", - "type": "Name", - "content": "Academia Sinica (Academia Sinica; Nankang, Taiwan). Formerly TELDAP. (2014-)", - "identifies": "http://vocab.getty.edu/aat/source/2000079740", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000822694-contributor-10000250", - "type": "Name", - "content": "Academia Sinica (Nankang, Taiwan)", - "identifies": "http://vocab.getty.edu/aat/contrib/10000250", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - } - ], - "language": [ - { - "id": "http://vocab.getty.edu/language/zh-hant", - "type": "Language", - "_label": "zh-hant" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/term/1000496475-nl", - "type": "Name", - "alternative": [ - { - "id": "http://vocab.getty.edu/aat/300187008#qualified-1000496475-nl", - "type": "Name", - "content": "Abnakee kleed", - "language": [ - { - "id": "http://vocab.getty.edu/language/nl", - "type": "Language", - "_label": "nl" - } - ] - } - ], - "content": "Abnakee kleed", - "classified_as": [ - { - "id": "http://vocab.getty.edu/term/type/AlternateDescriptor", - "type": "Type", - "_label": "Alternate Descriptor" - }, - { - "id": "http://vocab.getty.edu/term/POS/SingularNoun", - "type": "Type", - "_label": "Singular Noun" - } - ], - "referred_to_by": [ - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000496475-source-2000113770", - "type": "Name", - "content": "AAT Ned: Dutch AAT Translation Project coordinated by RKD (Netherlands Institute for Art History). The Hague, Bureau AAT, 1994-.", - "identifies": "http://vocab.getty.edu/aat/source/2000113770", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000496475-contributor-10000000", - "type": "Name", - "content": "Getty Vocabulary Program", - "identifies": "http://vocab.getty.edu/aat/contrib/10000000", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - }, - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000496475-contributor-10000205", - "type": "Name", - "content": "Netherlands Institute for Art History (RKD, The Hague) and the Royal Institute for Cultural Heritage (Brussels); Dutch translation collaboration between the Netherlands and Flanders", - "identifies": "http://vocab.getty.edu/aat/contrib/10000205", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - } - ], - "language": [ - { - "id": "http://vocab.getty.edu/language/nl", - "type": "Language", - "_label": "nl" - } - ] - }, + "@context": { + "skos": "http://www.w3.org/2004/02/skos/core#", + "isothes": "http://purl.org/iso25964/skos-thes#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "owl": "http://www.w3.org/2002/07/owl#", + "dct": "http://purl.org/dc/terms/", + "dc11": "http://purl.org/dc/elements/1.1/", + "uri": "@id", + "type": "@type", + "lang": "@language", + "value": "@value", + "graph": "@graph", + "label": "rdfs:label", + "prefLabel": "skos:prefLabel", + "altLabel": "skos:altLabel", + "hiddenLabel": "skos:hiddenLabel", + "broader": "skos:broader", + "narrower": "skos:narrower", + "related": "skos:related", + "inScheme": "skos:inScheme", + "exactMatch": "skos:exactMatch", + "closeMatch": "skos:closeMatch", + "broadMatch": "skos:broadMatch", + "narrowMatch": "skos:narrowMatch", + "relatedMatch": "skos:relatedMatch" + }, + "graph": [ { - "id": "http://vocab.getty.edu/aat/term/1000442929-es", - "type": "Name", - "alternative": [ - { - "id": "http://vocab.getty.edu/aat/300187008#qualified-1000442929-es", - "type": "Name", - "content": "alfombra abnakee", - "language": [ - { - "id": "http://vocab.getty.edu/language/es", - "type": "Language", - "_label": "es" - } - ] - } - ], - "content": "alfombra abnakee", - "classified_as": [ - { - "id": "http://vocab.getty.edu/term/type/AlternateDescriptor", - "type": "Type", - "_label": "Alternate Descriptor" - }, - { - "id": "http://vocab.getty.edu/term/POS/SingularNoun", - "type": "Type", - "_label": "Singular Noun" - } - ], - "referred_to_by": [ - { - "id": "http://vocab.getty.edu/aat/300187008#term-1000442929-source-2000051034", - "type": "Name", - "content": "Tesauro de Arte & Arquitectura database. Centro de Documentación de Bienes Patrimoniales, DIBAM. Santiago, Chile: 2000-. ", - "identifies": "http://vocab.getty.edu/aat/source/2000051034", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311936", - "type": "Type", - "_label": "primary sources" - } - ] - }, + "uri": "http://vocab.getty.edu/aat/300187008", + "type": "skos:Concept", + "inScheme": { + "uri": "http://vocabularies.dans.knaw.nl/aatconcepts" + }, + "prefLabel": [ { - "id": "http://vocab.getty.edu/aat/300187008#term-1000442929-contributor-10000000", - "type": "Name", - "content": "Getty Vocabulary Program", - "identifies": "http://vocab.getty.edu/aat/contrib/10000000", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] + "lang": "nl", + "value": "Abnakee kleden" }, { - "id": "http://vocab.getty.edu/aat/300187008#term-1000442929-contributor-10000131", - "type": "Name", - "content": "Centro de Documentación de Bienes Patrimoniales (Servicio Nacional del Patrimonio Cultural, Ministerio de las Culturas las Artes y el Patrimonio; Santiago, Chile)", - "identifies": "http://vocab.getty.edu/aat/contrib/10000131", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300403974", - "type": "Type", - "_label": "contributors" - } - ] - } - ], - "language": [ - { - "id": "http://vocab.getty.edu/language/es", - "type": "Language", - "_label": "es" + "lang": "en", + "value": "Abnakee rugs" } ] }, { - "id": "http://vocab.getty.edu/aat/300187008", - "type": "Identifier", - "content": "300187008", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300404629", - "type": "Type", - "_label": "Getty Vocabularies Identifier" - } - ] - } - ], - "_label": "Abnakee rugs", - "rdfs:seeAlso": [ - { - "id": "http://vocab.getty.edu/aat/aggregations/300187008/cross_referenced", - "type": "http://www.openarchives.org/ore/terms/Aggregation", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300311741", - "type": "Type", - "_label": "cross-references" - } - ], - "http://www.openarchives.org/ore/terms/aggregates": [ - { - "id": "http://vocab.getty.edu/aat/300311741" - }, - { - "id": "http://vocab.getty.edu/aat/300311936" - }, - { - "id": "http://vocab.getty.edu/aat/300403974" - }, - { - "id": "http://vocab.getty.edu/term/type/Descriptor" - }, - { - "id": "http://vocab.getty.edu/term/POS/PluralNoun" - }, - { - "id": "http://vocab.getty.edu/term/POS/NeuterAdjectival" - }, - { - "id": "http://vocab.getty.edu/term/type/UsedForTerm" - }, - { - "id": "http://vocab.getty.edu/term/type/AlternateDescriptor" - }, - { - "id": "http://vocab.getty.edu/term/POS/SingularNoun" - }, - { - "id": "http://vocab.getty.edu/term/POS/Noun" - } - ], - "_label": "Internal cross-references" - }, - { - "id": "http://vocab.getty.edu/aat/aggregations/300187008/hierarchy", - "type": "http://www.openarchives.org/ore/terms/Aggregation", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300417471", - "type": "Type", - "_label": "ancestor" - }, - { - "id": "http://vocab.getty.edu/aat/300417475", - "type": "Type", - "_label": "child" - } - ], - "_label": "ancestors and children" - }, - { - "id": "http://vocab.getty.edu/aat/aggregations/300187008/related", - "type": "http://www.openarchives.org/ore/terms/Aggregation", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/300417473", - "type": "Type", - "_label": "related concepts" - } - ], - "_label": "related concepts" - } - ], - "broader": [ - { - "id": "http://vocab.getty.edu/aat/300186946", - "type": "Type", - "_label": "" - } - ], - "skos:inScheme": { - "id": "http://vocab.getty.edu/aat/" - }, - "la:related_from_by": { - "id": "http://vocab.getty.edu/aat/relationships/2427-300187008-300053633", - "type": "la:Relationship", - "classified_as": [ - { - "id": "http://vocab.getty.edu/aat/relationships/2427", - "type": "Type", - "_label": "produced by - activity/event/process" + "uri": "http://vocabularies.dans.knaw.nl/aatconcepts", + "type": "skos:ConceptScheme", + "label": { + "lang": "en", + "value": "The Art and Architecture Thesaurus Concepts" } - ], - "la:relates_to": { - "id": "http://vocab.getty.edu/aat/300053633" } - } + ] } \ No newline at end of file From 5d0fe340fe1517605da08cde0c8d8db4c5246feb Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Mon, 5 May 2025 15:43:51 -0400 Subject: [PATCH 033/470] new api for spa to retrieve analytics html --- .../11448-api-endpoint-for-analytics-html.md | 5 ++ doc/sphinx-guides/source/api/native-api.rst | 17 +++++++ .../iq/dataverse/api/CustomizationApi.java | 29 ++++++++++++ .../iq/dataverse/api/CustomizationIT.java | 46 +++++++++++++++++++ .../edu/harvard/iq/dataverse/api/UtilIT.java | 6 +++ 5 files changed, 103 insertions(+) create mode 100644 doc/release-notes/11448-api-endpoint-for-analytics-html.md create mode 100644 src/main/java/edu/harvard/iq/dataverse/api/CustomizationApi.java create mode 100644 src/test/java/edu/harvard/iq/dataverse/api/CustomizationIT.java diff --git a/doc/release-notes/11448-api-endpoint-for-analytics-html.md b/doc/release-notes/11448-api-endpoint-for-analytics-html.md new file mode 100644 index 00000000000..f34f2cf04e2 --- /dev/null +++ b/doc/release-notes/11448-api-endpoint-for-analytics-html.md @@ -0,0 +1,5 @@ +### Feature Request: API endpoint for analytics.html + +New API to get the analytics.html from settings for SPA + +See also [the guides](https://dataverse-guide--11359.org.readthedocs.build/en/11359/installation/config.html#web-analytics-code), #11448. diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index c6bb5d82151..de7ee5c03df 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -7609,3 +7609,20 @@ Parameters: ``per_page`` Number of results returned per page. + +Customization: Web Analytics Code +--------------------------------- + +The Customization API is used to retrieve the analytics-code.html. See also :ref:`web-analytics-code` in the Configuration section of the Installation Guide. + +The content is returned in type="text/html; charset=UTF-8" + +A curl example getting the analytics-code + +.. code-block:: bash + + export SERVER_URL=https://demo.dataverse.org + + curl "$SERVER_URL/api/customization/analytics" + +.. _customization-analytics: diff --git a/src/main/java/edu/harvard/iq/dataverse/api/CustomizationApi.java b/src/main/java/edu/harvard/iq/dataverse/api/CustomizationApi.java new file mode 100644 index 00000000000..9ad586bea81 --- /dev/null +++ b/src/main/java/edu/harvard/iq/dataverse/api/CustomizationApi.java @@ -0,0 +1,29 @@ +package edu.harvard.iq.dataverse.api; + +import edu.harvard.iq.dataverse.settings.SettingsServiceBean; +import jakarta.ejb.EJB; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.Response; + +@Path("customization") +public class CustomizationApi extends AbstractApiBean { + + @EJB + SettingsServiceBean settingsService; + + @GET + @Path("analytics") + @Produces({"text/html; charset=UTF-8"}) + public Response getAnalyticsHTML() { + return getFromSettings(SettingsServiceBean.Key.WebAnalyticsCode, "text/html; charset=UTF-8"); + } + + private Response getFromSettings(SettingsServiceBean.Key key, String type) { + String value = settingsService.getValueForKey(key); + if (value != null) { + return Response.ok(value).type(type).build(); + } else { + return Response.status(Response.Status.NOT_FOUND).build(); + } + } +} diff --git a/src/test/java/edu/harvard/iq/dataverse/api/CustomizationIT.java b/src/test/java/edu/harvard/iq/dataverse/api/CustomizationIT.java new file mode 100644 index 00000000000..2effc36f752 --- /dev/null +++ b/src/test/java/edu/harvard/iq/dataverse/api/CustomizationIT.java @@ -0,0 +1,46 @@ +package edu.harvard.iq.dataverse.api; + +import edu.harvard.iq.dataverse.settings.SettingsServiceBean; +import io.restassured.response.Response; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; + +import static org.hamcrest.CoreMatchers.equalTo; + +public class CustomizationIT { + + @AfterEach + public void after() { + UtilIT.deleteSetting(SettingsServiceBean.Key.WebAnalyticsCode); + } + @Test + public void testGetCustomAnalytics() { + String html = """ + + + """; + + UtilIT.setSetting(SettingsServiceBean.Key.WebAnalyticsCode, html).prettyPrint(); + + Response getResponse = UtilIT.getCustomAnalyticsHTML(); + getResponse.prettyPrint(); + getResponse.then().assertThat() + .statusCode(200) + .body(equalTo(html)); + + UtilIT.deleteSetting(SettingsServiceBean.Key.WebAnalyticsCode).prettyPrint(); + + getResponse = UtilIT.getCustomAnalyticsHTML(); + getResponse.prettyPrint(); + getResponse.then().assertThat() + .statusCode(404); + } +} diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index 30a8f3107c2..b7e980bd90f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -4737,4 +4737,10 @@ public static Response updateDatasetFilesMetadata(String datasetIdOrPersistentId return given().header(API_TOKEN_HTTP_HEADER, apiToken).contentType(ContentType.JSON).body(jsonArray.toString()) .post("/api/datasets/" + idInPath + "/files/metadata" + optionalQueryParam); } + + public static Response getCustomAnalyticsHTML() { + return given() + .contentType("text/html; charset=UTF-8") + .get("/api/customization/analytics"); + } } From 5d0db40f07c2514bd1362ace1a04d72d1d5689f9 Mon Sep 17 00:00:00 2001 From: jo-pol Date: Tue, 6 May 2025 09:35:38 +0200 Subject: [PATCH 034/470] adjust expectation --- .../dataverse/DatasetFieldServiceBeanFilterResponseTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java index aa5fed0650f..f2dcc0f6738 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java @@ -49,6 +49,7 @@ void audience() throws Exception { String termURI = "https://www.narcis.nl/classification/D13700"; JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/audience.json"); JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/audience.json"); + // https://vocabs.datastations.nl/rest/v1/NARCIS/data&format=application/json&uri=https://www.narcis.nl/classification/D13700 JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); @@ -82,7 +83,7 @@ void aatClassification() throws Exception { assertThat(result.getString("@id")).isEqualTo(termURI); assertThat(getValue("en", result.get("vocabularyName"))).isEqualTo("The Art and Architecture Thesaurus Concepts"); - assertThat(result.getString("termName")).isEqualTo("Abnakee kleden"); + assertThat(getValue("nl", result.get("termName"))).isEqualTo("Abnakee kleden"); assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } @@ -133,6 +134,7 @@ void abrRapportType() throws Exception { String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/5701cb3d-0ffd-4663-98e0-fab808448109"; JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/abrRapportType.json"); JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/abrRapportType.json"); + // https://vocabs.datastations.nl/rest/v1/ABR/data&format=application/json&uri=https://data.cultureelerfgoed.nl/term/id/abr/5701cb3d-0ffd-4663-98e0-fab808448109 JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); From b9e879f9259aa182d3abc9af38127b9dce079932 Mon Sep 17 00:00:00 2001 From: jo-pol Date: Tue, 6 May 2025 10:24:41 +0200 Subject: [PATCH 035/470] http <-> https --- .../iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java index f2dcc0f6738..fdc0a83971a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java @@ -75,7 +75,7 @@ void collection() throws Exception { @Test void aatClassification() throws Exception { - String termURI = "https://vocab.getty.edu/aat/300187008"; + String termURI = "http://vocab.getty.edu/aat/300187008"; JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/AATClassification.json"); JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/AATClassification.json"); From 4296254f74b86c4e4532b3d03845a9e3195d4b98 Mon Sep 17 00:00:00 2001 From: jo-pol Date: Tue, 6 May 2025 12:03:43 +0200 Subject: [PATCH 036/470] as requested by review --- src/main/java/edu/harvard/iq/dataverse/api/Datasets.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index f754341a36b..7b4154cd730 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -66,7 +66,7 @@ import jakarta.ws.rs.container.ContainerRequestContext; import jakarta.ws.rs.core.*; import jakarta.ws.rs.core.Response.Status; -import org.apache.commons.lang.exception.ExceptionUtils; +import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.commons.lang3.StringUtils; import org.eclipse.microprofile.openapi.annotations.Operation; import org.eclipse.microprofile.openapi.annotations.media.Content; From 64281c735cb675a14d1c71196ef0c7654fde220d Mon Sep 17 00:00:00 2001 From: Leonid Andreev Date: Wed, 7 May 2025 09:20:24 -0400 Subject: [PATCH 037/470] Quick changes stripping the extra idp select components #11404 --- .../providers/shib/ShibServiceBean.java | 6 ++++-- src/main/webapp/loginpage.xhtml | 17 +++++++++++------ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java index 0921b2c6683..0f82ed65759 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java @@ -165,7 +165,9 @@ public BuiltinUser findBuiltInUserByAuthUserIdentifier(String authUserIdentifier } public String getAffiliation(String shibIdp, DevShibAccountType devShibAccountType) { - JsonArray emptyJsonArray = new JsonArray(); + return "Foobar University"; + + /*JsonArray emptyJsonArray = new JsonArray(); String discoFeedJson = emptyJsonArray.toString(); String discoFeedUrl; if (devShibAccountType.equals(DevShibAccountType.PRODUCTION)) { @@ -228,7 +230,7 @@ public String getAffiliation(String shibIdp, DevShibAccountType devShibAccountTy } else { logger.info("Couldn't find an affiliation from " + shibIdp); return null; - } + }*/ } private void mutateRequestForDevRandom(HttpServletRequest request) { diff --git a/src/main/webapp/loginpage.xhtml b/src/main/webapp/loginpage.xhtml index d2b0ec5e434..21389bfa02c 100644 --- a/src/main/webapp/loginpage.xhtml +++ b/src/main/webapp/loginpage.xhtml @@ -105,6 +105,7 @@ +

@@ -123,10 +124,14 @@

-
@@ -158,9 +163,9 @@ shibLangBundle["defaultLogoAlt"] = "#{bundle['idp.defaultLogoAlt']}"; - - - + + +
From f0296da69eb487253ba171923d372d1db3247cd4 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Mon, 12 May 2025 14:42:07 +0200 Subject: [PATCH 038/470] feat: migrate personOrOrg settings to MPConfig --- .../source/installation/config.rst | 5 ++- .../iq/dataverse/settings/JvmSettings.java | 5 +++ .../iq/dataverse/util/PersonOrOrgUtil.java | 39 ++--------------- .../dataverse/util/PersonOrOrgUtilTest.java | 42 +++++++++++++------ 4 files changed, 41 insertions(+), 50 deletions(-) diff --git a/doc/sphinx-guides/source/installation/config.rst b/doc/sphinx-guides/source/installation/config.rst index c1790302de9..b0192a56997 100644 --- a/doc/sphinx-guides/source/installation/config.rst +++ b/doc/sphinx-guides/source/installation/config.rst @@ -3093,6 +3093,8 @@ Please note that this setting is experimental. The Schema.org metadata and OpenAIRE exports and the Schema.org metadata included in DatasetPages try to infer whether each entry in the various fields (e.g. Author, Contributor) is a Person or Organization. If you are sure that users are following the guidance to add people in the recommended family name, given name order, with a comma, you can set this true to always assume entries without a comma are for Organizations. The default is false. +Can also be set via *MicroProfile Config API* sources, e.g. the environment variable ``DATAVERSE_PERSONORORG_ASSUMECOMMAINPERSONNAME``. + .. _dataverse.personOrOrg.orgPhraseArray: dataverse.personOrOrg.orgPhraseArray @@ -3102,8 +3104,9 @@ Please note that this setting is experimental. The Schema.org metadata and OpenAIRE exports and the Schema.org metadata included in DatasetPages try to infer whether each entry in the various fields (e.g. Author, Contributor) is a Person or Organization. If you have examples where an orgization name is being inferred to belong to a person, you can use this setting to force it to be recognized as an organization. -The value is expected to be a JsonArray of strings. Any name that contains one of the strings is assumed to be an organization. For example, "Project" is a word that is not otherwise associated with being an organization. +The value is expected to be a comma-separated list of strings. Any name that contains one of the strings is assumed to be an organization. For example, "Project" is a word that is not otherwise associated with being an organization. +Can also be set via *MicroProfile Config API* sources, e.g. the environment variable ``DATAVERSE_PERSONORORG_ORGPHRASEARRAY``. .. _dataverse.api.signature-secret: diff --git a/src/main/java/edu/harvard/iq/dataverse/settings/JvmSettings.java b/src/main/java/edu/harvard/iq/dataverse/settings/JvmSettings.java index bc32e250be5..cf5965eb122 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/JvmSettings.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/JvmSettings.java @@ -263,6 +263,11 @@ public enum JvmSettings { //CSL CITATION SETTINGS SCOPE_CSL(PREFIX, "csl"), CSL_COMMON_STYLES(SCOPE_CSL, "common-styles"), + + // PersonOrOrgUtil SETTINGS + SCOPE_PERSONORORG(PREFIX, "personOrOrg"), + ASSUME_COMMA_IN_PERSON_NAME(SCOPE_PERSONORORG, "assumeCommaInPersonName"), + ORG_PHRASE_ARRAY(SCOPE_PERSONORORG, "orgPhraseArray"), ; private static final String SCOPE_SEPARATOR = "."; diff --git a/src/main/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtil.java index 80e32184731..3edb40ee6ea 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtil.java @@ -1,15 +1,11 @@ package edu.harvard.iq.dataverse.util; -import java.util.ArrayList; -import java.util.List; import java.util.logging.Logger; -import jakarta.json.JsonArray; +import edu.harvard.iq.dataverse.settings.JvmSettings; import jakarta.json.JsonObject; import jakarta.json.JsonObjectBuilder; -import jakarta.json.JsonString; -import edu.harvard.iq.dataverse.util.json.JsonUtil; import edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder; /** @@ -38,14 +34,6 @@ public class PersonOrOrgUtil { private static final Logger logger = Logger.getLogger(PersonOrOrgUtil.class.getCanonicalName()); - static boolean assumeCommaInPersonName = false; - static List orgPhrases; - - static { - setAssumeCommaInPersonName(Boolean.parseBoolean(System.getProperty("dataverse.personOrOrg.assumeCommaInPersonName", "false"))); - setOrgPhraseArray(System.getProperty("dataverse.personOrOrg.orgPhraseArray", null)); - } - /** * This method tries to determine if a name belongs to a person or an * organization and, if it is a person, what the given and family names are. The @@ -73,6 +61,7 @@ public static JsonObject getPersonOrOrganization(String name, boolean organizati boolean isOrganization = !isPerson && Organizations.getInstance().isOrganization(name); if (!isOrganization) { + String[] orgPhrases = JvmSettings.ORG_PHRASE_ARRAY.lookupOptional(String[].class).orElse(new String[]{}); for (String phrase : orgPhrases) { if (name.contains(phrase)) { isOrganization = true; @@ -99,6 +88,7 @@ public static JsonObject getPersonOrOrganization(String name, boolean organizati } } else { + boolean assumeCommaInPersonName = JvmSettings.ASSUME_COMMA_IN_PERSON_NAME.lookupOptional(Boolean.class).orElse(false); if (assumeCommaInPersonName && !isPerson) { isOrganization = true; } else { @@ -135,27 +125,4 @@ public static JsonObject getPersonOrOrganization(String name, boolean organizati return job.build(); } - - // Public for testing - public static void setOrgPhraseArray(String phraseArray) { - orgPhrases = new ArrayList(); - if (!StringUtil.isEmpty(phraseArray)) { - try { - JsonArray phrases = JsonUtil.getJsonArray(phraseArray); - phrases.forEach(val -> { - JsonString strVal = (JsonString) val; - orgPhrases.add(strVal.getString()); - }); - } catch (Exception e) { - logger.warning("Could not parse Org phrase list"); - } - } - - } - - // Public for testing - public static void setAssumeCommaInPersonName(boolean assume) { - assumeCommaInPersonName = assume; - } - } diff --git a/src/test/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtilTest.java index d772ba2b9da..ec72f789d41 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/PersonOrOrgUtilTest.java @@ -1,13 +1,17 @@ package edu.harvard.iq.dataverse.util; +import edu.harvard.iq.dataverse.settings.JvmSettings; import edu.harvard.iq.dataverse.util.json.JsonUtil; +import edu.harvard.iq.dataverse.util.testing.JvmSetting; +import edu.harvard.iq.dataverse.util.testing.LocalJvmSettings; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; import jakarta.json.JsonObject; +@LocalJvmSettings public class PersonOrOrgUtilTest { public PersonOrOrgUtilTest() { @@ -26,27 +30,39 @@ public void testOrganizationCOMPLEXName() { verifyIsOrganization("The Ford Foundation"); verifyIsOrganization("United Nations Economic and Social Commission for Asia and the Pacific (UNESCAP)"); verifyIsOrganization("Michael J. Fox Foundation for Parkinson's Research"); - // The next example is one known to be asserted to be a Person without an entry - // in the OrgWordArray - // So we test with it in the array and then when the array is empty to verify - // the array works, resetting the array works, and the problem still exists in + // The next examples are known to be asserted to be a Person without an entry in the OrgWordArray + // So we test when no array is set via JvmSetting to verify the problem still exists in // the underlying algorithm - PersonOrOrgUtil.setOrgPhraseArray("[\"Portable\"]"); - verifyIsOrganization("Portable Antiquities of the Netherlands"); - PersonOrOrgUtil.setOrgPhraseArray(null); JsonObject obj = PersonOrOrgUtil.getPersonOrOrganization("Portable Antiquities of the Netherlands", false, false); assertTrue(obj.getBoolean("isPerson")); + JsonObject obj2 = PersonOrOrgUtil.getPersonOrOrganization("Max Mustermann GmbH", false, false); + assertTrue(obj2.getBoolean("isPerson")); + } + + @Test + @JvmSetting(key = JvmSettings.ORG_PHRASE_ARRAY, value = "Portable,GmbH") + public void testOrganizationWithOrgPhraseArray() { + // The next examples are known to be asserted to be a Person without an entry in the OrgWordArray + // So we test with the array set via JvmSetting to verify the array works + verifyIsOrganization("Portable Antiquities of the Netherlands"); + verifyIsOrganization("Max Mustermann GmbH"); } @Test public void testOrganizationAcademicName() { + verifyIsOrganization("John Smith Center"); + verifyIsOrganization("John Smith Group"); + // An example the base algorithm doesn't handle: + JsonObject obj = PersonOrOrgUtil.getPersonOrOrganization("John Smith Project", false, false); + assertTrue(obj.getBoolean("isPerson")); + } - verifyIsOrganization("John Smith Center"); - verifyIsOrganization("John Smith Group"); - //An example the base algorithm doesn't handle: - PersonOrOrgUtil.setAssumeCommaInPersonName(true); - verifyIsOrganization("John Smith Project"); - PersonOrOrgUtil.setAssumeCommaInPersonName(false); + @Test + @JvmSetting(key = JvmSettings.ASSUME_COMMA_IN_PERSON_NAME, value = "true") + public void testOrganizationAcademicNameWithAssumeComma() { + verifyIsOrganization("John Smith Center"); + verifyIsOrganization("John Smith Group"); + verifyIsOrganization("John Smith Project"); } From 409f98d81beef4a3eb459c16fa5d1f22b4c15b82 Mon Sep 17 00:00:00 2001 From: Leonid Andreev Date: Mon, 12 May 2025 10:25:46 -0400 Subject: [PATCH 039/470] hard-coded (working?) experiments #11404 --- .../java/edu/harvard/iq/dataverse/LoginPage.java | 6 ++++++ src/main/webapp/loginpage.xhtml | 13 ++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/LoginPage.java b/src/main/java/edu/harvard/iq/dataverse/LoginPage.java index 16d2cc53cb9..108b24684a1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/LoginPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/LoginPage.java @@ -254,6 +254,12 @@ public String getRedirectPage() { public void setRedirectPage(String redirectPage) { this.redirectPage = redirectPage; } + + public String getShibAuthRedirect() { + //String hardCodedWayFinderUrl = "https://wayfinder.incommon.org/?entityID=https%3A%2F%2Fdataverse6.rdmc.unc.edu&return=https%3A%2F%2Fdataverse6.rdmc.unc.edu%2FShibboleth.sso%2FLogin%3FSAMLDS%3D1%2526target%3Dhttps%3A%2F%2Fdataverse6.rdmc.unc.edu%2Fshib.xhtml%253FredirectPage%253D%25252Fdataverse.xhtml"; + String hardCodedWayFinderUrl = "https://wayfinder.incommon.org/?entityID=https%3A%2F%2Fdemo.dataverse.org%2Fsp&return=https%3A%2F%2Fdemo.dataverse.org%2FShibboleth.sso%2FLogin%3FSAMLDS%3D1%2526target%3Dhttps%3A%2F%2Fdemo.dataverse.org%2Fshib.xhtml%253FredirectPage%253D%25252Fdataverse.xhtml"; + return hardCodedWayFinderUrl; + } public AuthenticationProvider getAuthProvider() { return authProvider; diff --git a/src/main/webapp/loginpage.xhtml b/src/main/webapp/loginpage.xhtml index 21389bfa02c..6c508d27a3f 100644 --- a/src/main/webapp/loginpage.xhtml +++ b/src/main/webapp/loginpage.xhtml @@ -124,15 +124,14 @@
- + -
- - - - +
+ + +
From dbced9ef5eced810924526cc18833b0ca17fed4e Mon Sep 17 00:00:00 2001 From: Leonid Andreev Date: Mon, 12 May 2025 16:54:36 -0400 Subject: [PATCH 040/470] added a working implementation of populating the affiliation field w/out relying on discoffeed; wayfinder redirect url is still hard-coded; the overall setup is working on the unc test box. #11404 --- .../edu/harvard/iq/dataverse/LoginPage.java | 4 +- .../providers/builtin/DataverseUserPage.java | 2 +- .../providers/shib/ShibServiceBean.java | 103 +++++++++++++++++- 3 files changed, 103 insertions(+), 6 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/LoginPage.java b/src/main/java/edu/harvard/iq/dataverse/LoginPage.java index 108b24684a1..f7ccc202470 100644 --- a/src/main/java/edu/harvard/iq/dataverse/LoginPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/LoginPage.java @@ -256,8 +256,8 @@ public void setRedirectPage(String redirectPage) { } public String getShibAuthRedirect() { - //String hardCodedWayFinderUrl = "https://wayfinder.incommon.org/?entityID=https%3A%2F%2Fdataverse6.rdmc.unc.edu&return=https%3A%2F%2Fdataverse6.rdmc.unc.edu%2FShibboleth.sso%2FLogin%3FSAMLDS%3D1%2526target%3Dhttps%3A%2F%2Fdataverse6.rdmc.unc.edu%2Fshib.xhtml%253FredirectPage%253D%25252Fdataverse.xhtml"; - String hardCodedWayFinderUrl = "https://wayfinder.incommon.org/?entityID=https%3A%2F%2Fdemo.dataverse.org%2Fsp&return=https%3A%2F%2Fdemo.dataverse.org%2FShibboleth.sso%2FLogin%3FSAMLDS%3D1%2526target%3Dhttps%3A%2F%2Fdemo.dataverse.org%2Fshib.xhtml%253FredirectPage%253D%25252Fdataverse.xhtml"; + String hardCodedWayFinderUrl = "https://wayfinder.incommon.org/?entityID=https%3A%2F%2Fdataverse6.rdmc.unc.edu&return=https%3A%2F%2Fdataverse6.rdmc.unc.edu%2FShibboleth.sso%2FLogin%3FSAMLDS%3D1%2526target%3Dhttps%3A%2F%2Fdataverse6.rdmc.unc.edu%2Fshib.xhtml%253FredirectPage%253D%25252Fdataverse.xhtml"; + //String hardCodedWayFinderUrl = "https://wayfinder.incommon.org/?entityID=https%3A%2F%2Fdemo.dataverse.org%2Fsp&return=https%3A%2F%2Fdemo.dataverse.org%2FShibboleth.sso%2FLogin%3FSAMLDS%3D1%2526target%3Dhttps%3A%2F%2Fdemo.dataverse.org%2Fshib.xhtml%253FredirectPage%253D%25252Fdataverse.xhtml"; return hardCodedWayFinderUrl; } diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/DataverseUserPage.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/DataverseUserPage.java index 2ad67ac9fef..1193e269fc3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/DataverseUserPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/DataverseUserPage.java @@ -213,7 +213,7 @@ public String init() { } else { return permissionsWrapper.notAuthorized(); } - + return ""; } diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java index 0f82ed65759..5170f5ecd3b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java @@ -24,6 +24,12 @@ import jakarta.ejb.Stateless; import jakarta.inject.Named; import jakarta.servlet.http.HttpServletRequest; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; @Named @Stateless @@ -42,6 +48,9 @@ public class ShibServiceBean { @EJB SettingsServiceBean settingsService; + private static final String INCOMMON_MDQ_API_BASE = "https://mdq.incommon.org"; + private static final String INCOMMON_MDQ_API_ENTITIES_URL = INCOMMON_MDQ_API_BASE + "/entities/"; + /** * "Production" means "don't mess with the HTTP request". */ @@ -165,9 +174,97 @@ public BuiltinUser findBuiltInUserByAuthUserIdentifier(String authUserIdentifier } public String getAffiliation(String shibIdp, DevShibAccountType devShibAccountType) { - return "Foobar University"; + if (!devShibAccountType.equals(DevShibAccountType.PRODUCTION)) { + return getAffiliationFromDiscoFeed(shibIdp, devShibAccountType); + } + String entityIdEncoded = URLEncoder.encode(shibIdp, StandardCharsets.UTF_8); + String apiUrl = INCOMMON_MDQ_API_ENTITIES_URL + entityIdEncoded; //"https://mdq.incommon.org/entities/https%3A%2F%2Ffed.huit.harvard.edu%2Fidp%2Fshibboleth" + + logger.info("cooked Incommon MDQ url: " + apiUrl); + + URL url = null; + try { + url = new URL(apiUrl); + } catch (MalformedURLException ex) { + logger.warning(ex.toString()); + return null; + } + if (url == null) { + logger.warning("url object was null after parsing " + apiUrl); + return null; + } - /*JsonArray emptyJsonArray = new JsonArray(); + HttpURLConnection mdqApiRequest = null; + try { + mdqApiRequest = (HttpURLConnection) url.openConnection(); + } catch (IOException ex) { + logger.warning(ex.toString()); + return null; + } + if (mdqApiRequest == null) { + logger.warning("mdq api request was null"); + return null; + } + try { + mdqApiRequest.connect(); + } catch (IOException ex) { + logger.warning(ex.toString()); + return null; + } + + XMLStreamReader xmlr = null; + + try { + XMLInputFactory xmlFactory = javax.xml.stream.XMLInputFactory.newInstance(); + xmlr = xmlFactory.createXMLStreamReader(new InputStreamReader((InputStream) mdqApiRequest.getInputStream())); + + while ( xmlr.next() == XMLStreamConstants.COMMENT ); + //xmlr.nextTag(); + xmlr.require(XMLStreamConstants.START_ELEMENT, null, "EntityDescriptor"); + + while (xmlr.hasNext()) { + int event = xmlr.next(); + + if (event == XMLStreamConstants.START_ELEMENT) { + String currentElement = xmlr.getLocalName(); + + if ("OrganizationDisplayName".equals(currentElement)) { + int eventType = xmlr.next(); + if (eventType == XMLStreamConstants.CHARACTERS) { + String affiliation = xmlr.getText(); + return affiliation; + } else { + logger.warning("Unexpected contet in the OrganizationDisplayName element"); + return null; + } + } + + } else if (event == XMLStreamConstants.END_ELEMENT) { + if (xmlr.getLocalName().equals("EntityDescriptor")) return null; + } + } + + } catch (IOException ioex) { + logger.warning("IOException instantiating a stream reader of the mdq api output" + ioex.getMessage()); + } catch (XMLStreamException xsex) { + logger.warning("Failed to parse the xml output of the mdq api; " + xsex.getMessage()); + } finally { + if (xmlr != null) { + try { + logger.info("closing xml reader"); + xmlr.close(); + } catch (XMLStreamException xsex) { + // do we care? + } + } + } + + logger.warning("Failed to find an affiliation for " + shibIdp); + return null; + } + + public String getAffiliationFromDiscoFeed(String shibIdp, DevShibAccountType devShibAccountType) { + JsonArray emptyJsonArray = new JsonArray(); String discoFeedJson = emptyJsonArray.toString(); String discoFeedUrl; if (devShibAccountType.equals(DevShibAccountType.PRODUCTION)) { @@ -230,7 +327,7 @@ public String getAffiliation(String shibIdp, DevShibAccountType devShibAccountTy } else { logger.info("Couldn't find an affiliation from " + shibIdp); return null; - }*/ + } } private void mutateRequestForDevRandom(HttpServletRequest request) { From 320628db81169c6fe73456e226d48907acf8005b Mon Sep 17 00:00:00 2001 From: jo-pol Date: Mon, 12 May 2025 13:24:25 +0200 Subject: [PATCH 041/470] ssh vocabs --- ...setFieldServiceBeanFilterResponseTest.java | 116 ++- .../cessdaClassification.json | 47 + .../json/cvoc-dans-config/collectionMode.json | 49 + .../cvoc-dans-config/elsstClassification.json | 48 + .../cvoc-dans-config/researchInstrument.json | 47 + .../cvoc-dans-config/samplingProcedureCV.json | 49 + .../json/cvoc-dans-config/timeMethod.json | 47 + .../json/cvoc-dans-config/unitOfAnalysys.json | 49 + .../cvoc-dans-value/cessdaClassification.json | 57 ++ .../json/cvoc-dans-value/collectionMode.json | 57 ++ .../cvoc-dans-value/elsstClassification.json | 862 ++++++++++++++++++ .../cvoc-dans-value/researchInstrument.json | 57 ++ .../cvoc-dans-value/samplingProcedureCV.json | 54 ++ .../json/cvoc-dans-value/timeMethod.json | 57 ++ .../json/cvoc-dans-value/unitOfAnalysis.json | 54 ++ 15 files changed, 1644 insertions(+), 6 deletions(-) create mode 100644 src/test/resources/json/cvoc-dans-config/cessdaClassification.json create mode 100644 src/test/resources/json/cvoc-dans-config/collectionMode.json create mode 100644 src/test/resources/json/cvoc-dans-config/elsstClassification.json create mode 100644 src/test/resources/json/cvoc-dans-config/researchInstrument.json create mode 100644 src/test/resources/json/cvoc-dans-config/samplingProcedureCV.json create mode 100644 src/test/resources/json/cvoc-dans-config/timeMethod.json create mode 100644 src/test/resources/json/cvoc-dans-config/unitOfAnalysys.json create mode 100644 src/test/resources/json/cvoc-dans-value/cessdaClassification.json create mode 100644 src/test/resources/json/cvoc-dans-value/collectionMode.json create mode 100644 src/test/resources/json/cvoc-dans-value/elsstClassification.json create mode 100644 src/test/resources/json/cvoc-dans-value/researchInstrument.json create mode 100644 src/test/resources/json/cvoc-dans-value/samplingProcedureCV.json create mode 100644 src/test/resources/json/cvoc-dans-value/timeMethod.json create mode 100644 src/test/resources/json/cvoc-dans-value/unitOfAnalysis.json diff --git a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java index fdc0a83971a..5a20188bbab 100644 --- a/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/DatasetFieldServiceBeanFilterResponseTest.java @@ -24,6 +24,8 @@ public class DatasetFieldServiceBeanFilterResponseTest { void setUp() { this.datasetFieldServiceBean = new DatasetFieldServiceBean(); +// for debugging purposes +// // Logger rootLogger = Logger.getLogger(DatasetFieldServiceBean.class.getCanonicalName()); // rootLogger.setLevel(Level.FINE); // @@ -49,7 +51,7 @@ void audience() throws Exception { String termURI = "https://www.narcis.nl/classification/D13700"; JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/audience.json"); JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/audience.json"); - // https://vocabs.datastations.nl/rest/v1/NARCIS/data&format=application/json&uri=https://www.narcis.nl/classification/D13700 + // https://vocabs.datastations.nl/NARCIS/en/page/D13700 JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); @@ -64,6 +66,7 @@ void collection() throws Exception { String termURI = "https://vocabularies.dans.knaw.nl/collections/archaeology/ArcheoDepot"; JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/collection.json"); JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/collection.json"); + // https://vocabs.datastations.nl/rest/v1/DansCollections/data?uri=https://vocabularies.dans.knaw.nl/collections/archaeology/ArcheoDepot&format=application/json JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); @@ -78,6 +81,7 @@ void aatClassification() throws Exception { String termURI = "http://vocab.getty.edu/aat/300187008"; JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/AATClassification.json"); JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/AATClassification.json"); + // https://vocabs.datastations.nl/AATC/en/page/300187008 JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); @@ -92,6 +96,7 @@ void abrPeriod() throws Exception { String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f"; JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/abrPeriod.json"); JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/abrPeriod.json"); + // https://vocabs.datastations.nl/ABR/en/page/?uri=https://data.cultureelerfgoed.nl/term/id/abr/533f6881-7c2d-49fc-bce6-71a839558c0f&clang=nl JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); @@ -106,6 +111,7 @@ void abrArtifact() throws Exception { String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/db8feb21-8ddc-432f-8062-a3a15f7f7cf4"; JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/abrArtifact.json"); JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/abrArtifact.json"); + // https://vocabs.datastations.nl/ABR/en/page/?uri=https://data.cultureelerfgoed.nl/term/id/abr/db8feb21-8ddc-432f-8062-a3a15f7f7cf4&clang=nl JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); @@ -120,6 +126,7 @@ void abrVerwervingswijze() throws Exception { String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/b7f4fe13-d7b4-4fb9-a7a8-c25ef74b612d"; JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/abrVerwervingswijze.json"); JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/abrVerwervingswijze.json"); + // https://vocabs.datastations.nl/ABR/en/page/?uri=https://data.cultureelerfgoed.nl/term/id/abr/e06a84fa-62e8-42ff-8f38-0ddfe9485a15&clang=nl JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); @@ -134,7 +141,7 @@ void abrRapportType() throws Exception { String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/5701cb3d-0ffd-4663-98e0-fab808448109"; JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/abrRapportType.json"); JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/abrRapportType.json"); - // https://vocabs.datastations.nl/rest/v1/ABR/data&format=application/json&uri=https://data.cultureelerfgoed.nl/term/id/abr/5701cb3d-0ffd-4663-98e0-fab808448109 + // https://vocabs.datastations.nl/ABR/en/page/?uri=https://data.cultureelerfgoed.nl/term/id/abr/5701cb3d-0ffd-4663-98e0-fab808448109 JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); @@ -149,6 +156,7 @@ void abrComplex() throws Exception { String termURI = "https://data.cultureelerfgoed.nl/term/id/abr/1b5b4dd1-f4f8-4e4c-9108-a6fb2c606cde"; JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/abrComplex.json"); JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/abrComplex.json"); + // https://vocabs.datastations.nl/ABR/en/page/?uri=https://data.cultureelerfgoed.nl/term/id/abr/1b5b4dd1-f4f8-4e4c-9108-a6fb2c606cde JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); assertThat(result.getString("@id")).isEqualTo(termURI); @@ -156,6 +164,105 @@ void abrComplex() throws Exception { assertThat(getValue("nl", result.get("termName"))).isEqualTo("(ring)walburg"); assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); } + + @Test + void cessda() throws Exception { + String termURI = "https://vocabularies.cessda.eu/vocabulary/TopicClassification?v=4.2#TradeIndustryAndMarkets.AgricultureAndRuralIndustry"; + JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/cessdaClassification.json"); + JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/cessdaClassification.json"); + // https://vocabs.datastations.nl/TopicClassification_4_2/en/page/?uri=https://vocabularies.cessda.eu/vocabulary/TopicClassification?v=4.2#TradeIndustryAndRuralIndustry + + JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); + assertThat(result.getString("@id")).isEqualTo(termURI); + assertThat(result.getString("vocabularyName")).isEqualTo("CESSDA Topis classification 4.2"); + assertThat(getValue("en", result.get("termName"))).isEqualTo("Agriculture and rural industry"); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); + } + + @Test + void collectionMode() throws Exception { + String termURI = "http://rdf-vocabulary.ddialliance.org/cv/ModeOfCollection/4.0/#AutomatedDataExtraction.WebScraping"; + JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/collectionMode.json"); + JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/collectionMode.json"); + // https://vocabs.datastations.nl/ModeOfCollection_4_0/en/page/?uri=http://rdf-vocabulary.ddialliance.org/cv/ModeOfCollection/4.0/#AutomatedDataExtraction.WebScraping + + JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); + assertThat(result.getString("@id")).isEqualTo(termURI); + assertThat(result.getString("vocabularyName")).isEqualTo("DDI Alliance Controlled Vocabulary for Analysis Unit 2.1"); + assertThat(getValue("en", result.get("termName"))).isEqualTo("Automated data extraction: Web scraping"); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); + } + + @Test + void elsstClassification() throws Exception { + String termURI = "https://elsst.cessda.eu/id/4/bf0d664a-e89a-4ec3-80d2-04f664b359ab"; + JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/elsstClassification.json"); + JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/elsstClassification.json"); + // https://vocabs.datastations.nl/ELSST_R4/en/page/bf0d664a-e89a-4ec3-80d2-04f664b359ab + + JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); + assertThat(result.getString("@id")).isEqualTo(termURI); + assertThat(result.getString("vocabularyName")).isEqualTo("ELSST Thesaurus Version 4"); + assertThat(getValue("nl", result.get("termName"))).isEqualTo("ACADEMISCHE VAARDIGHEDEN"); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); + } + + @Test + void researchInstrument() throws Exception { + String termURI = "http://rdf-vocabulary.ddialliance.org/cv/TypeOfInstrument/1.1/#Questionnaire.Semistructured"; + JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/researchInstrument.json"); + JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/researchInstrument.json"); + // https://vocabs.datastations.nl/TypeOfInstrument_1_1/en/page/?uri=http://rdf-vocabulary.ddialliance.org/cv/TypeOfInstrument/1.1/#Questionnaire.Semistructured + + JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); + assertThat(result.getString("@id")).isEqualTo(termURI); + assertThat(result.getString("vocabularyName")).isEqualTo("DDI Alliance Controlled Vocabulary for Type of Instrument 1.1"); + assertThat(getValue("en", result.get("termName"))).isEqualTo("Semi-structured questionnaire"); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); + } + + @Test + void samplingProcedureCV() throws Exception { + String termURI = "http://rdf-vocabulary.ddialliance.org/cv/SamplingProcedure/1.1/#MixedProbabilityNonprobability"; + JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/samplingProcedureCV.json"); + JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/samplingProcedureCV.json"); + // https://vocabs.datastations.nl/SamplingProcedure_1_1/en/page/?uri=http://rdf-vocabulary.ddialliance.org/cv/SamplingProcedure/1.1/#MixedProbabilityNonprobability + + JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); + assertThat(result.getString("@id")).isEqualTo(termURI); + assertThat(result.getString("vocabularyName")).isEqualTo("DDI Alliance Controlled Vocabulary for Sampling Procedure 1.1"); + assertThat(getValue("en", result.get("termName"))).isEqualTo("Mixed probability and non-probability"); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); + } + + @Test + void timeMethod() throws Exception { + String termURI = "http://rdf-vocabulary.ddialliance.org/cv/TimeMethod/1.2/#TimeSeries.Discrete"; + JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/timeMethod.json"); + JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/timeMethod.json"); + // https://vocabs.datastations.nl/TimeMethod_1_2/en/page/?uri=http://rdf-vocabulary.ddialliance.org/cv/TimeMethod/1.2/#TimeSeries.Discrete + + JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); + assertThat(result.getString("@id")).isEqualTo(termURI); + assertThat(result.getString("vocabularyName")).isEqualTo("DDI Alliance Controlled Vocabulary for Time Method 1.2"); + assertThat(getValue("en", result.get("termName"))).isEqualTo("Time series: Discrete"); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); + } + + @Test + void unitOfAnalysis() throws Exception { + String termURI = "http://rdf-vocabulary.ddialliance.org/cv/AnalysisUnit/2.1/#EventOrProcessOrActivity"; + JsonObject cvocEntry = readObject("src/test/resources/json/cvoc-dans-config/unitOfAnalysys.json"); + JsonObject readObject = readObject("src/test/resources/json/cvoc-dans-value/unitOfAnalysis.json"); + // https://vocabs.datastations.nl/AnalysisUnit_2_1/en/page/?uri=http://rdf-vocabulary.ddialliance.org/cv/AnalysisUnit/2.1/#EventOrProcessOrActivity + + JsonObject result = callFilterResponse(cvocEntry, readObject, termURI); + assertThat(result.getString("@id")).isEqualTo(termURI); + assertThat(result.getString("vocabularyName")).isEqualTo("DDI Alliance Controlled Vocabulary for Analysis Unit 2.1"); + assertThat(getValue("en", result.get("termName"))).isEqualTo("Event/Process/Activity"); + assertThat(result.keySet()).containsExactlyInAnyOrder("@id", "termName", "vocabularyUri", "vocabularyName"); + } + private String getValue(String nl, JsonValue values) { if (values instanceof JsonArray) { for (var item : (JsonArray) values) { @@ -164,8 +271,7 @@ private String getValue(String nl, JsonValue values) { return obj.getString("value"); } } - } else if (values instanceof JsonObject) { - JsonObject obj = (JsonObject) values; + } else if (values instanceof JsonObject obj) { if (nl.equals(obj.getString("lang", ""))) { return obj.getString("value"); } @@ -173,8 +279,6 @@ private String getValue(String nl, JsonValue values) { return null; // Return null if no match is found } - // TODO add more tests for other CVOC entries - private JsonObject readObject(String pathname) throws FileNotFoundException { var reader = new FileReader(pathname); return Json.createReader(reader).readObject(); diff --git a/src/test/resources/json/cvoc-dans-config/cessdaClassification.json b/src/test/resources/json/cvoc-dans-config/cessdaClassification.json new file mode 100644 index 00000000000..305f2759199 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-config/cessdaClassification.json @@ -0,0 +1,47 @@ +{ + "allow-free-text": false, + "cvoc-url": "https://dev.vocabs.datastations.nl/", + "field-name": "dansCessdaClassification", + "js-url": "/custom/skosmos.js", + "languages": "en", + "managed-fields": {}, + "protocol": "skosmos", + "retrieval-filtering": { + "@context": { + "lang": "@language", + "termName": "https://schema.org/name", + "value": "@value", + "vocabularyName": "https://dataverse.org/schema/vocabularyName", + "vocabularyUri": "https://dataverse.org/schema/vocabularyUri" + }, + "@id": { + "params": [ + "@id" + ], + "pattern": "{0}" + }, + "termName": { + "params": [ + "/graph/uri=@id/prefLabel" + ], + "pattern": "{0}" + }, + "vocabularyName": { + "params": [], + "pattern": "CESSDA Topis classification 4.2" + }, + "vocabularyUri": { + "params": [], + "pattern": "https://vocabularies.cessda.eu/vocabulary/TopicClassification?v=4.2" + } + }, + "retrieval-uri": "https://dev.vocabs.datastations.nl/rest/v1/data?uri={0}", + "term-parent-uri": "", + "term-uri-field": "dansCessdaClassification", + "vocabs": { + "TopicClassification_4_2": { + "uriSpace": "https://vocabularies.cessda.eu/vocabulary/TopicClassification?v=4.2", + "vocabularyUri": "https://vocabularies.cessda.eu/vocabulary/TopicClassification?v=4.2" + } + } +} \ No newline at end of file diff --git a/src/test/resources/json/cvoc-dans-config/collectionMode.json b/src/test/resources/json/cvoc-dans-config/collectionMode.json new file mode 100644 index 00000000000..2bf5ec47784 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-config/collectionMode.json @@ -0,0 +1,49 @@ +{ + "allow-free-text": false, + "cvoc-url": "https://dev.vocabs.datastations.nl/", + "field-name": "dansCollectionMode", + "js-url": "/custom/skosmos.js", + "languages": "en", + "managed-fields": {}, + "protocol": "skosmos", + "retrieval-filtering": { + "@context": { + "lang": "@language", + "termName": "https://schema.org/name", + "value": "@value", + "vocabularyName": "https://dataverse.org/schema/vocabularyName", + "vocabularyUri": "https://dataverse.org/schema/vocabularyUri" + }, + "@id": { + "params": [ + "@id" + ], + "pattern": "{0}" + }, + "termName": { + "params": [ + "/graph/uri=@id/prefLabel" + ], + "pattern": "{0}" + }, + "vocabularyName": { + "pattern": "DDI Alliance Controlled Vocabulary for Analysis Unit 2.1", + "params": [] + }, + "vocabularyUri": { + "params": [ + "/graph/type=skos:ConceptScheme/uri" + ], + "pattern": "{0}" + } + }, + "retrieval-uri": "https://dev.vocabs.datastations.nl/rest/v1/data?uri={0}", + "term-parent-uri": "", + "term-uri-field": "dansCollectionMode", + "vocabs": { + "ModeOfCollection_4_0": { + "uriSpace": "http://rdf-vocabulary.ddialliance.org/cv/ModeOfCollection/4.0/", + "vocabularyUri": "http://rdf-vocabulary.ddialliance.org/cv/ModeOfCollection/4.0/" + } + } +} \ No newline at end of file diff --git a/src/test/resources/json/cvoc-dans-config/elsstClassification.json b/src/test/resources/json/cvoc-dans-config/elsstClassification.json new file mode 100644 index 00000000000..b5dc1ec84e2 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-config/elsstClassification.json @@ -0,0 +1,48 @@ +{ + "allow-free-text": false, + "cvoc-url": "https://dev.vocabs.datastations.nl/", + "field-name": "dansElsstClassification", + "js-url": "/custom/skosmos.js", + "languages": "en", + "managed-fields": { + }, + "protocol": "skosmos", + "retrieval-filtering": { + "@context": { + "lang": "@language", + "termName": "https://schema.org/name", + "value": "@value", + "vocabularyName": "https://dataverse.org/schema/vocabularyName", + "vocabularyUri": "https://dataverse.org/schema/vocabularyUri" + }, + "@id": { + "params": [ + "@id" + ], + "pattern": "{0}" + }, + "termName": { + "params": [ + "/graph/uri=@id/prefLabel" + ], + "pattern": "{0}" + }, + "vocabularyName": { + "pattern": "ELSST Thesaurus Version 4", + "params": [] + }, + "vocabularyUri": { + "pattern": "https://elsst.cessda.eu/id/", + "params": [] + } + }, + "retrieval-uri": "https://dev.vocabs.datastations.nl/rest/v1/data?uri={0}", + "term-parent-uri": "", + "term-uri-field": "dansElsstClassification", + "vocabs": { + "ELSST_R4": { + "uriSpace": "https://elsst.cessda.eu/id/", + "vocabularyUri": "https://elsst.cessda.eu/id/" + } + } +} \ No newline at end of file diff --git a/src/test/resources/json/cvoc-dans-config/researchInstrument.json b/src/test/resources/json/cvoc-dans-config/researchInstrument.json new file mode 100644 index 00000000000..4315b71f487 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-config/researchInstrument.json @@ -0,0 +1,47 @@ +{ + "allow-free-text": false, + "cvoc-url": "https://dev.vocabs.datastations.nl/", + "field-name": "dansResearchInstrument", + "js-url": "/custom/skosmos.js", + "languages": "en", + "managed-fields": {}, + "protocol": "skosmos", + "retrieval-filtering": { + "@context": { + "lang": "@language", + "termName": "https://schema.org/name", + "value": "@value", + "vocabularyName": "https://dataverse.org/schema/vocabularyName", + "vocabularyUri": "https://dataverse.org/schema/vocabularyUri" + }, + "@id": { + "params": [ + "@id" + ], + "pattern": "{0}" + }, + "termName": { + "params": [ + "/graph/uri=@id/prefLabel" + ], + "pattern": "{0}" + }, + "vocabularyName": { + "pattern": "DDI Alliance Controlled Vocabulary for Type of Instrument 1.1", + "params": [] + }, + "vocabularyUri": { + "pattern": "http://rdf-vocabulary.ddialliance.org/cv/TypeOfInstrument/1.1/", + "params": [] + } + }, + "retrieval-uri": "https://dev.vocabs.datastations.nl/rest/v1/data?uri={0}", + "term-parent-uri": "", + "term-uri-field": "dansResearchInstrument", + "vocabs": { + "TypeOfInstrument_1_1": { + "uriSpace": "http://rdf-vocabulary.ddialliance.org/cv/TypeOfInstrument/1.1/", + "vocabularyUri": "http://rdf-vocabulary.ddialliance.org/cv/TypeOfInstrument/1.1/" + } + } +} \ No newline at end of file diff --git a/src/test/resources/json/cvoc-dans-config/samplingProcedureCV.json b/src/test/resources/json/cvoc-dans-config/samplingProcedureCV.json new file mode 100644 index 00000000000..b82862fc068 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-config/samplingProcedureCV.json @@ -0,0 +1,49 @@ +{ + "allow-free-text": false, + "cvoc-url": "https://dev.vocabs.datastations.nl/", + "field-name": "dansSamplingProcedureCV", + "js-url": "/custom/skosmos.js", + "languages": "en", + "managed-fields": {}, + "protocol": "skosmos", + "retrieval-filtering": { + "@context": { + "lang": "@language", + "termName": "https://schema.org/name", + "value": "@value", + "vocabularyName": "https://dataverse.org/schema/vocabularyName", + "vocabularyUri": "https://dataverse.org/schema/vocabularyUri" + }, + "@id": { + "params": [ + "@id" + ], + "pattern": "{0}" + }, + "termName": { + "params": [ + "/graph/uri=@id/prefLabel" + ], + "pattern": "{0}" + }, + "vocabularyName": { + "pattern": "DDI Alliance Controlled Vocabulary for Sampling Procedure 1.1", + "params": [] + }, + "vocabularyUri": { + "params": [ + "/graph/type=skos:ConceptScheme/uri" + ], + "pattern": "{0}" + } + }, + "retrieval-uri": "https://dev.vocabs.datastations.nl/rest/v1/data?uri={0}", + "term-parent-uri": "", + "term-uri-field": "dansSamplingProcedureCV", + "vocabs": { + "SamplingProcedure_1_1": { + "uriSpace": "http://rdf-vocabulary.ddialliance.org/cv/SamplingProcedure/1.1/", + "vocabularyUri": "http://rdf-vocabulary.ddialliance.org/cv/SamplingProcedure/1.1/" + } + } +} \ No newline at end of file diff --git a/src/test/resources/json/cvoc-dans-config/timeMethod.json b/src/test/resources/json/cvoc-dans-config/timeMethod.json new file mode 100644 index 00000000000..b3e537fc64c --- /dev/null +++ b/src/test/resources/json/cvoc-dans-config/timeMethod.json @@ -0,0 +1,47 @@ +{ + "allow-free-text": false, + "cvoc-url": "https://dev.vocabs.datastations.nl/", + "field-name": "dansTimeMethod", + "js-url": "/custom/skosmos.js", + "languages": "en", + "managed-fields": {}, + "protocol": "skosmos", + "retrieval-filtering": { + "@context": { + "lang": "@language", + "termName": "https://schema.org/name", + "value": "@value", + "vocabularyName": "https://dataverse.org/schema/vocabularyName", + "vocabularyUri": "https://dataverse.org/schema/vocabularyUri" + }, + "@id": { + "params": [ + "@id" + ], + "pattern": "{0}" + }, + "termName": { + "params": [ + "/graph/uri=@id/prefLabel" + ], + "pattern": "{0}" + }, + "vocabularyName": { + "pattern": "DDI Alliance Controlled Vocabulary for Time Method 1.2", + "params": [] + }, + "vocabularyUri": { + "pattern": "http://rdf-vocabulary.ddialliance.org/cv/TimeMethod/1.2/", + "params": [] + } + }, + "retrieval-uri": "https://dev.vocabs.datastations.nl/rest/v1/data?uri={0}", + "term-parent-uri": "", + "term-uri-field": "dansTimeMethod", + "vocabs": { + "TimeMethod_1_2": { + "uriSpace": "http://rdf-vocabulary.ddialliance.org/cv/TimeMethod/1.2/", + "vocabularyUri": "http://rdf-vocabulary.ddialliance.org/cv/TimeMethod/1.2/" + } + } +} \ No newline at end of file diff --git a/src/test/resources/json/cvoc-dans-config/unitOfAnalysys.json b/src/test/resources/json/cvoc-dans-config/unitOfAnalysys.json new file mode 100644 index 00000000000..e6861f428c6 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-config/unitOfAnalysys.json @@ -0,0 +1,49 @@ +{ + "allow-free-text": false, + "cvoc-url": "https://dev.vocabs.datastations.nl/", + "field-name": "dansUnitOfAnalysis", + "js-url": "/custom/skosmos.js", + "languages": "en", + "managed-fields": {}, + "protocol": "skosmos", + "retrieval-filtering": { + "@context": { + "lang": "@language", + "termName": "https://schema.org/name", + "value": "@value", + "vocabularyName": "https://dataverse.org/schema/vocabularyName", + "vocabularyUri": "https://dataverse.org/schema/vocabularyUri" + }, + "@id": { + "params": [ + "@id" + ], + "pattern": "{0}" + }, + "termName": { + "params": [ + "/graph/uri=@id/prefLabel" + ], + "pattern": "{0}" + }, + "vocabularyName": { + "pattern": "DDI Alliance Controlled Vocabulary for Analysis Unit 2.1", + "params": [] + }, + "vocabularyUri": { + "params": [ + "/graph/type=skos:ConceptScheme/uri" + ], + "pattern": "{0}" + } + }, + "retrieval-uri": "https://dev.vocabs.datastations.nl/rest/v1/data?uri={0}", + "term-parent-uri": "", + "term-uri-field": "dansUnitOfAnalysis", + "vocabs": { + "AnalysisUnit_2_1": { + "uriSpace": "http://rdf-vocabulary.ddialliance.org/cv/AnalysisUnit/2.1/", + "vocabularyUri": "http://rdf-vocabulary.ddialliance.org/cv/AnalysisUnit/2.1/" + } + } +} \ No newline at end of file diff --git a/src/test/resources/json/cvoc-dans-value/cessdaClassification.json b/src/test/resources/json/cvoc-dans-value/cessdaClassification.json new file mode 100644 index 00000000000..46ae1c4be20 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-value/cessdaClassification.json @@ -0,0 +1,57 @@ +{ + "@context": { + "skos": "http://www.w3.org/2004/02/skos/core#", + "isothes": "http://purl.org/iso25964/skos-thes#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "owl": "http://www.w3.org/2002/07/owl#", + "dct": "http://purl.org/dc/terms/", + "dc11": "http://purl.org/dc/elements/1.1/", + "uri": "@id", + "type": "@type", + "lang": "@language", + "value": "@value", + "graph": "@graph", + "label": "rdfs:label", + "prefLabel": "skos:prefLabel", + "altLabel": "skos:altLabel", + "hiddenLabel": "skos:hiddenLabel", + "broader": "skos:broader", + "narrower": "skos:narrower", + "related": "skos:related", + "inScheme": "skos:inScheme", + "exactMatch": "skos:exactMatch", + "closeMatch": "skos:closeMatch", + "broadMatch": "skos:broadMatch", + "narrowMatch": "skos:narrowMatch", + "relatedMatch": "skos:relatedMatch" + }, + "graph": [ + { + "uri": "https://vocabularies.cessda.eu/vocabulary/TopicClassification?v=4.2", + "type": "skos:ConceptScheme", + "skos:notation": "TopicClassification" + }, + { + "uri": "https://vocabularies.cessda.eu/vocabulary/TopicClassification?v=4.2#TradeIndustryAndMarkets", + "narrower": { + "uri": "https://vocabularies.cessda.eu/vocabulary/TopicClassification?v=4.2#TradeIndustryAndMarkets.AgricultureAndRuralIndustry" + } + }, + { + "uri": "https://vocabularies.cessda.eu/vocabulary/TopicClassification?v=4.2#TradeIndustryAndMarkets.AgricultureAndRuralIndustry", + "type": "skos:Concept", + "skos:definition": { + "lang": "en", + "value": "Data on agricultural production and all rural industries which include, for example, fisheries and forestry." + }, + "inScheme": { + "uri": "https://vocabularies.cessda.eu/vocabulary/TopicClassification?v=4.2" + }, + "skos:notation": "TradeIndustryAndMarkets.AgricultureAndRuralIndustry", + "prefLabel": { + "lang": "en", + "value": "Agriculture and rural industry" + } + } + ] +} \ No newline at end of file diff --git a/src/test/resources/json/cvoc-dans-value/collectionMode.json b/src/test/resources/json/cvoc-dans-value/collectionMode.json new file mode 100644 index 00000000000..61d96c23226 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-value/collectionMode.json @@ -0,0 +1,57 @@ +{ + "@context": { + "skos": "http://www.w3.org/2004/02/skos/core#", + "isothes": "http://purl.org/iso25964/skos-thes#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "owl": "http://www.w3.org/2002/07/owl#", + "dct": "http://purl.org/dc/terms/", + "dc11": "http://purl.org/dc/elements/1.1/", + "uri": "@id", + "type": "@type", + "lang": "@language", + "value": "@value", + "graph": "@graph", + "label": "rdfs:label", + "prefLabel": "skos:prefLabel", + "altLabel": "skos:altLabel", + "hiddenLabel": "skos:hiddenLabel", + "broader": "skos:broader", + "narrower": "skos:narrower", + "related": "skos:related", + "inScheme": "skos:inScheme", + "exactMatch": "skos:exactMatch", + "closeMatch": "skos:closeMatch", + "broadMatch": "skos:broadMatch", + "narrowMatch": "skos:narrowMatch", + "relatedMatch": "skos:relatedMatch" + }, + "graph": [ + { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/ModeOfCollection/4.0/", + "type": "skos:ConceptScheme", + "skos:notation": "ModeOfCollection" + }, + { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/ModeOfCollection/4.0/#AutomatedDataExtraction", + "narrower": { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/ModeOfCollection/4.0/#AutomatedDataExtraction.WebScraping" + } + }, + { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/ModeOfCollection/4.0/#AutomatedDataExtraction.WebScraping", + "type": "skos:Concept", + "skos:definition": { + "lang": "en", + "value": "A technique employed to extract large amounts of data from websites and save it to a local file or database for further processing or storage. Also called screen scraping, web data extraction, web harvesting, etc." + }, + "inScheme": { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/ModeOfCollection/4.0/" + }, + "skos:notation": "AutomatedDataExtraction.WebScraping", + "prefLabel": { + "lang": "en", + "value": "Automated data extraction: Web scraping" + } + } + ] +} \ No newline at end of file diff --git a/src/test/resources/json/cvoc-dans-value/elsstClassification.json b/src/test/resources/json/cvoc-dans-value/elsstClassification.json new file mode 100644 index 00000000000..2b614b46670 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-value/elsstClassification.json @@ -0,0 +1,862 @@ +{ + "@context": { + "skos": "http://www.w3.org/2004/02/skos/core#", + "isothes": "http://purl.org/iso25964/skos-thes#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "owl": "http://www.w3.org/2002/07/owl#", + "dct": "http://purl.org/dc/terms/", + "dc11": "http://purl.org/dc/elements/1.1/", + "uri": "@id", + "type": "@type", + "lang": "@language", + "value": "@value", + "graph": "@graph", + "label": "rdfs:label", + "prefLabel": "skos:prefLabel", + "altLabel": "skos:altLabel", + "hiddenLabel": "skos:hiddenLabel", + "broader": "skos:broader", + "narrower": "skos:narrower", + "related": "skos:related", + "inScheme": "skos:inScheme", + "exactMatch": "skos:exactMatch", + "closeMatch": "skos:closeMatch", + "broadMatch": "skos:broadMatch", + "narrowMatch": "skos:narrowMatch", + "relatedMatch": "skos:relatedMatch" + }, + "graph": [ + { + "uri": "dct:identifier", + "label": { + "lang": "en", + "value": "URN" + } + }, + { + "uri": "dct:isVersionOf", + "label": { + "lang": "en", + "value": "Is a version of" + } + }, + { + "uri": "http://rdf-vocabulary.ddialliance.org/xkos#additionalContentNote", + "label": { + "lang": "en", + "value": "DEFINITION SOURCE" + } + }, + { + "uri": "owl:priorVersion", + "label": { + "lang": "en", + "value": "Has previous version" + } + }, + { + "uri": "https://elsst.cessda.eu/id/4/", + "type": [ + "skos:ConceptScheme", + "owl:Ontology" + ], + "prefLabel": [ + { + "lang": "hu", + "value": "ELSST Thesaurus" + }, + { + "lang": "is", + "value": "ELSST Thesaurus" + }, + { + "lang": "en", + "value": "ELSST Thesaurus" + }, + { + "lang": "cs", + "value": "ELSST Thesaurus" + }, + { + "lang": "da", + "value": "ELSST Thesaurus" + }, + { + "lang": "de", + "value": "ELSST Thesaurus" + }, + { + "lang": "el", + "value": "ELSST Thesaurus" + }, + { + "lang": "es", + "value": "ELSST Thesaurus" + }, + { + "lang": "fi", + "value": "ELSST Thesaurus" + }, + { + "lang": "fr", + "value": "ELSST Thesaurus" + }, + { + "lang": "lt", + "value": "ELSST Thesaurus" + }, + { + "lang": "nl", + "value": "ELSST Thesaurus" + }, + { + "lang": "no", + "value": "ELSST Thesaurus" + }, + { + "lang": "ro", + "value": "ELSST Thesaurus" + }, + { + "lang": "sl", + "value": "ELSST Thesaurus" + }, + { + "lang": "sv", + "value": "ELSST Thesaurus" + } + ] + }, + { + "uri": "https://elsst.cessda.eu/id/4/269a8d84-0b08-4034-a79c-129072cc1992", + "type": "skos:Concept", + "prefLabel": [ + { + "lang": "el", + "value": "ΕΚΠΑΙΔΕΥΤΙΚΗ ΑΞΙΟΛΟΓΗΣΗ" + }, + { + "lang": "no", + "value": "VURDERING AV UTDANNING" + }, + { + "lang": "de", + "value": "BEURTEILUNG (BILDUNG)" + }, + { + "lang": "nl", + "value": "EDUCATIEVE BEOORDELING" + }, + { + "lang": "en", + "value": "EDUCATIONAL ASSESSMENT" + }, + { + "lang": "es", + "value": "EVALUACIÓN EDUCATIVA" + }, + { + "lang": "ro", + "value": "EVALUARE EDUCAȚIONALĂ" + }, + { + "lang": "fr", + "value": "ÉVALUATION DES COMPÉTENCES SCOLAIRES" + }, + { + "lang": "cs", + "value": "HODNOCENÍ ŽÁKŮ A STUDENTŮ" + }, + { + "lang": "hu", + "value": "ISKOLAI ÉRTÉKELÉS" + }, + { + "lang": "sv", + "value": "KUNSKAPSBEDÖMNING" + }, + { + "lang": "lt", + "value": "MOKYMO VERTINIMAS" + }, + { + "lang": "is", + "value": "NÁMSMAT" + }, + { + "lang": "fi", + "value": "OPPILASARVIOINTI" + }, + { + "lang": "sl", + "value": "ŠOLSKA OCENA" + }, + { + "lang": "da", + "value": "VURDERING AF UDDANNELSER" + } + ], + "related": { + "uri": "https://elsst.cessda.eu/id/4/bf0d664a-e89a-4ec3-80d2-04f664b359ab" + } + }, + { + "uri": "https://elsst.cessda.eu/id/4/32caebf0-7bb4-4cfc-b67b-4bbd1041057f", + "type": "skos:Concept", + "narrower": { + "uri": "https://elsst.cessda.eu/id/4/bf0d664a-e89a-4ec3-80d2-04f664b359ab" + }, + "prefLabel": [ + { + "lang": "el", + "value": "ΙΚΑΝΟΤΗΤΑ" + }, + { + "lang": "nl", + "value": "VERMOGEN" + }, + { + "lang": "en", + "value": "ABILITY" + }, + { + "lang": "es", + "value": "CAPACIDAD" + }, + { + "lang": "fr", + "value": "CAPACITÉ" + }, + { + "lang": "ro", + "value": "COMPETENȚĂ" + }, + { + "lang": "da", + "value": "EVNE" + }, + { + "lang": "no", + "value": "EVNER" + }, + { + "lang": "is", + "value": "FÆRNI" + }, + { + "lang": "de", + "value": "FÄHIGKEIT" + }, + { + "lang": "sv", + "value": "FÖRMÅGA" + }, + { + "lang": "lt", + "value": "GEBĖJIMAS" + }, + { + "lang": "hu", + "value": "KÉPESSÉG" + }, + { + "lang": "fi", + "value": "KYVYKKYYS, LAHJAKKUUS JA TAIDOT" + }, + { + "lang": "cs", + "value": "SCHOPNOST" + }, + { + "lang": "sl", + "value": "SPOSOBNOST" + } + ] + }, + { + "uri": "https://elsst.cessda.eu/id/4/4e33f431-f8be-4e8c-b94b-67dcf5f834e1", + "type": "skos:Concept", + "prefLabel": [ + { + "lang": "el", + "value": "ΟΜΑΔΟΠΟΙΗΣΗ ΒΑΣΕΙ ΙΚΑΝΟΤΗΤΩΝ" + }, + { + "lang": "fi", + "value": "TASORYHMITTELY" + }, + { + "lang": "en", + "value": "ABILITY GROUPING" + }, + { + "lang": "es", + "value": "AGRUPAMIENTO POR CAPACIDAD" + }, + { + "lang": "nl", + "value": "COMPETENTIE-INDELING" + }, + { + "lang": "da", + "value": "EVNEGRUPPERING" + }, + { + "lang": "is", + "value": "FÆRNIFLOKKUN" + }, + { + "lang": "ro", + "value": "GRUPARE DUPĂ COMPETENȚE" + }, + { + "lang": "lt", + "value": "GRUPAVIMAS PAGAL GABUMUS" + }, + { + "lang": "de", + "value": "GRUPPIERUNG NACH BEGABUNG" + }, + { + "lang": "hu", + "value": "KÉPESSÉG SZERINTI CSOPORTOSÍTÁS" + }, + { + "lang": "no", + "value": "NIVÅGRUPPERING" + }, + { + "lang": "sv", + "value": "NIVÅGRUPPERING" + }, + { + "lang": "sl", + "value": "RAZVRŠČANJE PO SPOSOBNOSTIH" + }, + { + "lang": "fr", + "value": "REGROUPEMENT PAR COMPÉTENCE" + }, + { + "lang": "cs", + "value": "ROZDĚLENÍ PODLE SCHOPNOSTÍ" + } + ], + "related": { + "uri": "https://elsst.cessda.eu/id/4/bf0d664a-e89a-4ec3-80d2-04f664b359ab" + } + }, + { + "uri": "https://elsst.cessda.eu/id/4/77ae3d1f-2134-429e-bc81-bfd0c20ddce2", + "type": "skos:Concept", + "prefLabel": [ + { + "lang": "el", + "value": "ΕΚΠΑΙΔΕΥΤΙΚΑ ΕΠΙΠΕΔΑ" + }, + { + "lang": "no", + "value": "UTDANNINGSNIVÅ" + }, + { + "lang": "de", + "value": "BILDUNGSNIVEAUS" + }, + { + "lang": "en", + "value": "EDUCATIONAL LEVELS" + }, + { + "lang": "sl", + "value": "IZOBRAZBENA RAVEN" + }, + { + "lang": "fi", + "value": "KOULUTUSASTEET" + }, + { + "lang": "is", + "value": "MENNTUNARSTIG" + }, + { + "lang": "fr", + "value": "NIVEAUX D'ENSEIGNEMENT" + }, + { + "lang": "es", + "value": "NIVELES EDUCATIVOS" + }, + { + "lang": "ro", + "value": "NIVELURI EDUCAȚIONALE" + }, + { + "lang": "hu", + "value": "OKTATÁSI SZINT" + }, + { + "lang": "nl", + "value": "ONDERWIJSNIVEAUS" + }, + { + "lang": "lt", + "value": "ŠVIETIMO LYGIAI" + }, + { + "lang": "da", + "value": "UDDANNELSESNIVEAU" + }, + { + "lang": "cs", + "value": "ÚROVNĚ VZDĚLÁVÁNÍ" + }, + { + "lang": "sv", + "value": "UTBILDNINGSNIVÅ" + } + ], + "related": { + "uri": "https://elsst.cessda.eu/id/4/bf0d664a-e89a-4ec3-80d2-04f664b359ab" + } + }, + { + "uri": "https://elsst.cessda.eu/id/4/b1ab6f66-f3ed-42ec-9af5-2a896bdf119f", + "type": "skos:Concept", + "prefLabel": [ + { + "lang": "el", + "value": "ΟΜΑΔΟΠΟΙΗΣΗ ΣΤΗΝ ΕΚΠΑΙΔΕΥΣΗ" + }, + { + "lang": "no", + "value": "UTDANNINGSGRUPPER" + }, + { + "lang": "es", + "value": "AGRUPAMIENTO EDUCATIVO" + }, + { + "lang": "en", + "value": "EDUCATIONAL GROUPING" + }, + { + "lang": "ro", + "value": "GRUPARE EDUCAȚIONALĂ" + }, + { + "lang": "lt", + "value": "GRUPAVIMAS MOKYMO TIKSLAIS" + }, + { + "lang": "is", + "value": "HÓPASKIPTING Í NÁMI" + }, + { + "lang": "hu", + "value": "ISKOLAI CSOPORTBONTÁS" + }, + { + "lang": "nl", + "value": "ONDERWIJSGROEPERING" + }, + { + "lang": "fr", + "value": "REGROUPEMENT SCOLAIRE" + }, + { + "lang": "fi", + "value": "RYHMITTELY (KOULUTUS)" + }, + { + "lang": "cs", + "value": "UČEBNÍ SKUPINY" + }, + { + "lang": "sl", + "value": "UČNA SKUPINA" + }, + { + "lang": "da", + "value": "UDDANNELSESGRUPPERING" + }, + { + "lang": "de", + "value": "UNTERRICHTSGRUPPEN" + }, + { + "lang": "sv", + "value": "UTBILDNINGSGRUPPERING" + } + ], + "related": { + "uri": "https://elsst.cessda.eu/id/4/bf0d664a-e89a-4ec3-80d2-04f664b359ab" + } + }, + { + "uri": "https://elsst.cessda.eu/id/4/bf0d664a-e89a-4ec3-80d2-04f664b359ab", + "type": "skos:Concept", + "dct:identifier": [ + { + "lang": "sv", + "value": "urn:ddi:int.cessda.elsst:bf0d664a-e89a-4ec3-80d2-04f664b359ab:4" + }, + { + "lang": "sl", + "value": "urn:ddi:int.cessda.elsst:bf0d664a-e89a-4ec3-80d2-04f664b359ab:4" + }, + { + "lang": "ro", + "value": "urn:ddi:int.cessda.elsst:bf0d664a-e89a-4ec3-80d2-04f664b359ab:4" + }, + { + "lang": "no", + "value": "urn:ddi:int.cessda.elsst:bf0d664a-e89a-4ec3-80d2-04f664b359ab:4" + }, + { + "lang": "nl", + "value": "urn:ddi:int.cessda.elsst:bf0d664a-e89a-4ec3-80d2-04f664b359ab:4" + }, + { + "lang": "lt", + "value": "urn:ddi:int.cessda.elsst:bf0d664a-e89a-4ec3-80d2-04f664b359ab:4" + }, + { + "lang": "is", + "value": "urn:ddi:int.cessda.elsst:bf0d664a-e89a-4ec3-80d2-04f664b359ab:4" + }, + { + "lang": "hu", + "value": "urn:ddi:int.cessda.elsst:bf0d664a-e89a-4ec3-80d2-04f664b359ab:4" + }, + { + "lang": "fr", + "value": "urn:ddi:int.cessda.elsst:bf0d664a-e89a-4ec3-80d2-04f664b359ab:4" + }, + { + "lang": "fi", + "value": "urn:ddi:int.cessda.elsst:bf0d664a-e89a-4ec3-80d2-04f664b359ab:4" + }, + { + "lang": "es", + "value": "urn:ddi:int.cessda.elsst:bf0d664a-e89a-4ec3-80d2-04f664b359ab:4" + }, + { + "lang": "en", + "value": "urn:ddi:int.cessda.elsst:bf0d664a-e89a-4ec3-80d2-04f664b359ab:4" + }, + { + "lang": "el", + "value": "urn:ddi:int.cessda.elsst:bf0d664a-e89a-4ec3-80d2-04f664b359ab:4" + }, + { + "lang": "de", + "value": "urn:ddi:int.cessda.elsst:bf0d664a-e89a-4ec3-80d2-04f664b359ab:4" + }, + { + "lang": "da", + "value": "urn:ddi:int.cessda.elsst:bf0d664a-e89a-4ec3-80d2-04f664b359ab:4" + }, + { + "lang": "cs", + "value": "urn:ddi:int.cessda.elsst:bf0d664a-e89a-4ec3-80d2-04f664b359ab:4" + } + ], + "dct:isVersionOf": { + "uri": "https://elsst.cessda.eu/id/bf0d664a-e89a-4ec3-80d2-04f664b359ab" + }, + "dct:issued": { + "lang": "en", + "value": "2023-09-13" + }, + "dct:modified": { + "type": "http://www.w3.org/2001/XMLSchema#dateTime", + "value": "2022-03-01T10:28:48" + }, + "http://rdf-vocabulary.ddialliance.org/xkos#additionalContentNote": { + "lang": "en", + "value": "ERIC" + }, + "owl:priorVersion": { + "uri": "https://elsst.cessda.eu/id/3/bf0d664a-e89a-4ec3-80d2-04f664b359ab" + }, + "altLabel": [ + { + "lang": "fi", + "value": "SUORIUTUMISKYKY (KOULUTUS)" + }, + { + "lang": "en", + "value": "ACADEMIC APTITUDE" + }, + { + "lang": "lt", + "value": "AKADEMINIAI GABUMAI" + }, + { + "lang": "de", + "value": "AKADEMISCHE BEGABUNG" + }, + { + "lang": "de", + "value": "AKADEMISCHE EIGNUNG" + }, + { + "lang": "de", + "value": "AKADEMISCHE FAEHIGKEITEN" + }, + { + "lang": "de", + "value": "AKADEMISCHE FERTIGKEITEN" + }, + { + "lang": "sv", + "value": "AKADEMISK FÄRDIGHET" + }, + { + "lang": "sv", + "value": "AKADEMISK SKICKLIGHET" + }, + { + "lang": "sv", + "value": "AKADEMISKA ANLAG" + }, + { + "lang": "no", + "value": "AKADEMISKE ANLEGG" + }, + { + "lang": "ro", + "value": "APTITUDINE ACADEMICĂ" + }, + { + "lang": "es", + "value": "CAPACIDAD ACADÉMICA" + }, + { + "lang": "lt", + "value": "MOKSLUMAS" + }, + { + "lang": "cs", + "value": "OBECNÉ STUDIJNÍ PŘEDPOKLADY" + }, + { + "lang": "fi", + "value": "OPPIMISKYKY (KOULUTUS)" + } + ], + "broader": { + "uri": "https://elsst.cessda.eu/id/4/32caebf0-7bb4-4cfc-b67b-4bbd1041057f" + }, + "skos:definition": [ + { + "lang": "el", + "value": "Η ΙΚΑΝΟΤΗΤΑ ΠΡΑΓΜΑΤΩΣΗΣ ΑΚΑΔΗΜΑΪΚΩΝ Ή ΕΚΠΑΙΔΕΥΤΙΚΩΝ ΔΡΑΣΤΗΡΙΟΤΗΤΩΝ˙ Η ΔΥΝΑΤΟΤΗΤΑ ΕΠΙΤΕΥΞΗΣ ΥΨΗΛΩΝ ΑΚΑΔΗΜΑΪΚΩΝ ΣΤΟΧΩΝ" + }, + { + "lang": "en", + "value": "THE DEGREE OF ACTUAL COMPETENCE TO PERFORM IN SCHOLASTIC OR EDUCATIONAL ACTIVITIES" + }, + { + "lang": "fi", + "value": "KOULUTUKSELLINEN LAHJAKKUUS ELI KUINKA HYVIN YKSILÖ KYKENEE SUORIUTUMAAN KOULUSSA JA MUISSA OPINNOISSA." + }, + { + "lang": "ro", + "value": "GRADUL COMPETENȚELOR DE A PARTICIPA LA DIVERSE ACTIVITĂȚI SCOLASTICE SAU EDUCAȚIONALE; POTENȚIAL DE A OBȚINE STANDARDE ACADEMICE ÎNALTE " + }, + { + "lang": "no", + "value": "GRADEN AV FAKTISK KOMPETANSE TIL Å UTFØRE SKOLE- ELLER UTDANNINGSRELATERTE AKTIVITETER. POTENSIALET TIL Å OPPNÅ HØYE AKADEMISKE STANDARDER" + }, + { + "lang": "da", + "value": "GRADEN AF KOMPETENCE VED SKOLE- ELLER UNDEVISNINGSAKTIVITETER (ERIC) POTENTIALET FOR AT OPNÅ EN HØJ AKADEMISK STANDARD" + }, + { + "lang": "sv", + "value": "GRAD AV FAKTISK PRESTATIONSFÖRMÅGA INOM SKOL- OCH UTBILDNINGSAKTIVITETER. POTENTIAL ATT UPPNÅ HÖG AKADEMISK STANDARD." + }, + { + "lang": "es", + "value": "EL GRADO DE COMPETENCIA REAL PARA REALIZAR ACTIVIDADES ESCOLARES O EDUCATIVAS" + }, + { + "lang": "fr", + "value": "DEGRÉ DE COMPÉTENCE PERMETTANT DE PRENDRE PART À DES ACTIVITÉS SCOLAIRES OU UNIVERSITAIRES; POTENTIEL D’ATTEINDRE UN NIVEAU ACADÉMIQUE ÉLEVÉ." + }, + { + "lang": "nl", + "value": "DE MATE WAARIN DE BETROKKENE DAADWERKELIJK BEKWAAM IS OM ONDERWIJS- OF SCHOLINGSACTIVITEITEN UIT TE VOEREN; DE MOGELIJKHEID OM HOGE ACADEMISCHE NORMEN TE BEREIKEN OF VAARDIGHEDEN DIE AANGELEERD WORDEN OP EEN UNIVERSITEIT, OF EEN ANDERSOORTIGE WETENSCHAPPELIJKE INSTELLING." + }, + { + "lang": "de", + "value": "AUSMASS TATSÄCHLICHER KOMPETENZ AUF DEM GEBIET DER LEHRE; FÄHIGKEIT, EIN HOHES AKADEMISCHES NIVEAU ZU ERREICHEN." + }, + { + "lang": "lt", + "value": "AUKŠTŲ AKADEMINIŲ REZULTATŲ PASIEKIMO POTENCIALAS" + } + ], + "inScheme": { + "uri": "https://elsst.cessda.eu/id/4/" + }, + "prefLabel": [ + { + "lang": "el", + "value": "ΑΚΑΔΗΜΑΪΚΗ ΙΚΑΝΟΤΗΤΑ" + }, + { + "lang": "hu", + "value": "TUDOMÁNYOS KÉSZSÉG" + }, + { + "lang": "cs", + "value": "STUDIJNÍ PŘEDPOKLADY" + }, + { + "lang": "sl", + "value": "SPOSOBNOST ZA ŠTUDIJ" + }, + { + "lang": "is", + "value": "NÁMSFÆRNI" + }, + { + "lang": "fi", + "value": "KOULUTUKSELLINEN KYVYKKYYS" + }, + { + "lang": "fr", + "value": "COMPÉTENCE ACADÉMIQUE" + }, + { + "lang": "es", + "value": "APTITUD ACADÉMICA" + }, + { + "lang": "no", + "value": "AKADEMISKE EVNER" + }, + { + "lang": "sv", + "value": "AKADEMISK FÖRMÅGA" + }, + { + "lang": "da", + "value": "AKADEMISK EVNE" + }, + { + "lang": "de", + "value": "AKADEMISCHE FÄHIGKEITEN" + }, + { + "lang": "lt", + "value": "AKADEMINIAI GEBĖJIMAI" + }, + { + "lang": "nl", + "value": "ACADEMISCHE VAARDIGHEDEN" + }, + { + "lang": "en", + "value": "ACADEMIC ABILITY" + }, + { + "lang": "ro", + "value": "ABILITATE ACADEMICĂ" + } + ], + "related": [ + { + "uri": "https://elsst.cessda.eu/id/4/b1ab6f66-f3ed-42ec-9af5-2a896bdf119f" + }, + { + "uri": "https://elsst.cessda.eu/id/4/ffdd3a7e-f82e-4600-98b1-20402e74b0a6" + }, + { + "uri": "https://elsst.cessda.eu/id/4/269a8d84-0b08-4034-a79c-129072cc1992" + }, + { + "uri": "https://elsst.cessda.eu/id/4/77ae3d1f-2134-429e-bc81-bfd0c20ddce2" + }, + { + "uri": "https://elsst.cessda.eu/id/4/4e33f431-f8be-4e8c-b94b-67dcf5f834e1" + } + ] + }, + { + "uri": "https://elsst.cessda.eu/id/4/ffdd3a7e-f82e-4600-98b1-20402e74b0a6", + "type": "skos:Concept", + "prefLabel": [ + { + "lang": "el", + "value": "ΑΚΑΔΗΜΑΪΚΗ ΕΠΙΔΟΣΗ" + }, + { + "lang": "cs", + "value": "VZDĚLÁVACÍ VÝSLEDKY" + }, + { + "lang": "en", + "value": "ACADEMIC ACHIEVEMENT" + }, + { + "lang": "nl", + "value": "ACADEMISCHE PRESTATIE" + }, + { + "lang": "lt", + "value": "AKADEMINIAI PASIEKIMAI" + }, + { + "lang": "da", + "value": "AKADEMISK PRÆSTATION" + }, + { + "lang": "no", + "value": "AKADEMISKE PRESTASJON" + }, + { + "lang": "sl", + "value": "AKADEMSKI DOSEŽEK" + }, + { + "lang": "de", + "value": "BILDUNGSLEISTUNG" + }, + { + "lang": "es", + "value": "LOGROS ACADÉMICOS" + }, + { + "lang": "is", + "value": "NÁMSAFREK" + }, + { + "lang": "fi", + "value": "OPINTOMENESTYS" + }, + { + "lang": "ro", + "value": "REUȘITĂ ACADEMICĂ" + }, + { + "lang": "fr", + "value": "RÉUSSITE SCOLAIRE" + }, + { + "lang": "sv", + "value": "STUDIEPRESTATION" + }, + { + "lang": "hu", + "value": "TUDOMÁNYOS TELJESÍTMÉNY" + } + ], + "related": { + "uri": "https://elsst.cessda.eu/id/4/bf0d664a-e89a-4ec3-80d2-04f664b359ab" + } + } + ] +} \ No newline at end of file diff --git a/src/test/resources/json/cvoc-dans-value/researchInstrument.json b/src/test/resources/json/cvoc-dans-value/researchInstrument.json new file mode 100644 index 00000000000..ecf48a97f18 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-value/researchInstrument.json @@ -0,0 +1,57 @@ +{ + "@context": { + "skos": "http://www.w3.org/2004/02/skos/core#", + "isothes": "http://purl.org/iso25964/skos-thes#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "owl": "http://www.w3.org/2002/07/owl#", + "dct": "http://purl.org/dc/terms/", + "dc11": "http://purl.org/dc/elements/1.1/", + "uri": "@id", + "type": "@type", + "lang": "@language", + "value": "@value", + "graph": "@graph", + "label": "rdfs:label", + "prefLabel": "skos:prefLabel", + "altLabel": "skos:altLabel", + "hiddenLabel": "skos:hiddenLabel", + "broader": "skos:broader", + "narrower": "skos:narrower", + "related": "skos:related", + "inScheme": "skos:inScheme", + "exactMatch": "skos:exactMatch", + "closeMatch": "skos:closeMatch", + "broadMatch": "skos:broadMatch", + "narrowMatch": "skos:narrowMatch", + "relatedMatch": "skos:relatedMatch" + }, + "graph": [ + { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/TypeOfInstrument/1.1/", + "type": "skos:ConceptScheme", + "skos:notation": "TypeOfInstrument" + }, + { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/TypeOfInstrument/1.1/#Questionnaire", + "narrower": { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/TypeOfInstrument/1.1/#Questionnaire.Semistructured" + } + }, + { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/TypeOfInstrument/1.1/#Questionnaire.Semistructured", + "type": "skos:Concept", + "skos:definition": { + "lang": "en", + "value": "Set of pre-determined questions, a significant proportion of which are open-ended (roughly one third to two thirds), and the rest are closed-ended." + }, + "inScheme": { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/TypeOfInstrument/1.1/" + }, + "skos:notation": "Questionnaire.Semistructured", + "prefLabel": { + "lang": "en", + "value": "Semi-structured questionnaire" + } + } + ] +} \ No newline at end of file diff --git a/src/test/resources/json/cvoc-dans-value/samplingProcedureCV.json b/src/test/resources/json/cvoc-dans-value/samplingProcedureCV.json new file mode 100644 index 00000000000..dfb894a332c --- /dev/null +++ b/src/test/resources/json/cvoc-dans-value/samplingProcedureCV.json @@ -0,0 +1,54 @@ +{ + "@context": { + "skos": "http://www.w3.org/2004/02/skos/core#", + "isothes": "http://purl.org/iso25964/skos-thes#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "owl": "http://www.w3.org/2002/07/owl#", + "dct": "http://purl.org/dc/terms/", + "dc11": "http://purl.org/dc/elements/1.1/", + "uri": "@id", + "type": "@type", + "lang": "@language", + "value": "@value", + "graph": "@graph", + "label": "rdfs:label", + "prefLabel": "skos:prefLabel", + "altLabel": "skos:altLabel", + "hiddenLabel": "skos:hiddenLabel", + "broader": "skos:broader", + "narrower": "skos:narrower", + "related": "skos:related", + "inScheme": "skos:inScheme", + "exactMatch": "skos:exactMatch", + "closeMatch": "skos:closeMatch", + "broadMatch": "skos:broadMatch", + "narrowMatch": "skos:narrowMatch", + "relatedMatch": "skos:relatedMatch" + }, + "graph": [ + { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/SamplingProcedure/1.1/", + "type": "skos:ConceptScheme", + "skos:hasTopConcept": { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/SamplingProcedure/1.1/#MixedProbabilityNonprobability" + }, + "skos:notation": "SamplingProcedure" + }, + { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/SamplingProcedure/1.1/#MixedProbabilityNonprobability", + "type": "skos:Concept", + "skos:definition": { + "lang": "en", + "value": "Sample design that combines probability and non-probability sampling within the same sampling process. Different types of sampling may be used at different stages of creating the sample. For example, for a sample of minority students in a city, schools are randomly selected in the first stage. Then, a quota sample of students is selected within each school in the second stage. If separate samples are drawn from the same target population using different sampling methods, the type of sampling procedure used for each sample should be classified separately." + }, + "inScheme": { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/SamplingProcedure/1.1/" + }, + "skos:notation": "MixedProbabilityNonprobability", + "prefLabel": { + "lang": "en", + "value": "Mixed probability and non-probability" + } + } + ] +} \ No newline at end of file diff --git a/src/test/resources/json/cvoc-dans-value/timeMethod.json b/src/test/resources/json/cvoc-dans-value/timeMethod.json new file mode 100644 index 00000000000..785e5691ebb --- /dev/null +++ b/src/test/resources/json/cvoc-dans-value/timeMethod.json @@ -0,0 +1,57 @@ +{ + "@context": { + "skos": "http://www.w3.org/2004/02/skos/core#", + "isothes": "http://purl.org/iso25964/skos-thes#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "owl": "http://www.w3.org/2002/07/owl#", + "dct": "http://purl.org/dc/terms/", + "dc11": "http://purl.org/dc/elements/1.1/", + "uri": "@id", + "type": "@type", + "lang": "@language", + "value": "@value", + "graph": "@graph", + "label": "rdfs:label", + "prefLabel": "skos:prefLabel", + "altLabel": "skos:altLabel", + "hiddenLabel": "skos:hiddenLabel", + "broader": "skos:broader", + "narrower": "skos:narrower", + "related": "skos:related", + "inScheme": "skos:inScheme", + "exactMatch": "skos:exactMatch", + "closeMatch": "skos:closeMatch", + "broadMatch": "skos:broadMatch", + "narrowMatch": "skos:narrowMatch", + "relatedMatch": "skos:relatedMatch" + }, + "graph": [ + { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/TimeMethod/1.2/", + "type": "skos:ConceptScheme", + "skos:notation": "TimeMethod" + }, + { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/TimeMethod/1.2/#TimeSeries", + "narrower": { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/TimeMethod/1.2/#TimeSeries.Discrete" + } + }, + { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/TimeMethod/1.2/#TimeSeries.Discrete", + "type": "skos:Concept", + "skos:definition": { + "lang": "en", + "value": "Measurements are taken at (usually regularly) spaced intervals. Examples: macroeconomics (weekly share prices, monthly profits, sales); meteorology (hourly temperature); measurements of individuals (blood pressure, weight, height); sociology (crime figures, employment figures), etc." + }, + "inScheme": { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/TimeMethod/1.2/" + }, + "skos:notation": "TimeSeries.Discrete", + "prefLabel": { + "lang": "en", + "value": "Time series: Discrete" + } + } + ] +} \ No newline at end of file diff --git a/src/test/resources/json/cvoc-dans-value/unitOfAnalysis.json b/src/test/resources/json/cvoc-dans-value/unitOfAnalysis.json new file mode 100644 index 00000000000..cffb5d38c73 --- /dev/null +++ b/src/test/resources/json/cvoc-dans-value/unitOfAnalysis.json @@ -0,0 +1,54 @@ +{ + "@context": { + "skos": "http://www.w3.org/2004/02/skos/core#", + "isothes": "http://purl.org/iso25964/skos-thes#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "owl": "http://www.w3.org/2002/07/owl#", + "dct": "http://purl.org/dc/terms/", + "dc11": "http://purl.org/dc/elements/1.1/", + "uri": "@id", + "type": "@type", + "lang": "@language", + "value": "@value", + "graph": "@graph", + "label": "rdfs:label", + "prefLabel": "skos:prefLabel", + "altLabel": "skos:altLabel", + "hiddenLabel": "skos:hiddenLabel", + "broader": "skos:broader", + "narrower": "skos:narrower", + "related": "skos:related", + "inScheme": "skos:inScheme", + "exactMatch": "skos:exactMatch", + "closeMatch": "skos:closeMatch", + "broadMatch": "skos:broadMatch", + "narrowMatch": "skos:narrowMatch", + "relatedMatch": "skos:relatedMatch" + }, + "graph": [ + { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/AnalysisUnit/2.1/", + "type": "skos:ConceptScheme", + "skos:hasTopConcept": { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/AnalysisUnit/2.1/#EventOrProcessOrActivity" + }, + "skos:notation": "AnalysisUnit" + }, + { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/AnalysisUnit/2.1/#EventOrProcessOrActivity", + "type": "skos:Concept", + "skos:definition": { + "lang": "en", + "value": "Any type of incident, occurrence, or activity. Events are usually one-time, individual occurrences, with a limited or short duration. Examples: criminal offenses, riots, meetings, elections, sports competitions, terrorist attacks, natural disasters like floods, etc. Processes typically take place over time, and may include multiple 'events' or gradual changes that ultimately lead, or are projected to lead, to a particular result. Examples: court trials, criminal investigations, political campaigns, medical treatments, education, athletes' training, etc. Use when the main focus is more on the event, process or activity itself. For example, a field observation study on slot machine gambling; or data collected on child abuse cases, such as the type and duration of abuse, the role of the persons involved, etc." + }, + "inScheme": { + "uri": "http://rdf-vocabulary.ddialliance.org/cv/AnalysisUnit/2.1/" + }, + "skos:notation": "EventOrProcessOrActivity", + "prefLabel": { + "lang": "en", + "value": "Event/Process/Activity" + } + } + ] +} \ No newline at end of file From 173360b5d3772f2c022a5ff559c0ec8439d2c685 Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Tue, 13 May 2025 11:03:14 -0400 Subject: [PATCH 042/470] refactored to move api to /info --- doc/sphinx-guides/source/api/native-api.rst | 17 +++- .../CustomizationFilesServiceBean.java | 91 ++++++++++++++++++ .../dataverse/CustomizationFilesServlet.java | 95 +------------------ .../iq/dataverse/api/CustomizationApi.java | 29 ------ .../edu/harvard/iq/dataverse/api/Info.java | 25 ++++- .../iq/dataverse/api/CustomizationIT.java | 32 +++---- .../edu/harvard/iq/dataverse/api/UtilIT.java | 11 ++- 7 files changed, 148 insertions(+), 152 deletions(-) create mode 100644 src/main/java/edu/harvard/iq/dataverse/CustomizationFilesServiceBean.java delete mode 100644 src/main/java/edu/harvard/iq/dataverse/api/CustomizationApi.java diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index de7ee5c03df..a880ef4f64b 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -7610,19 +7610,28 @@ Parameters: ``per_page`` Number of results returned per page. -Customization: Web Analytics Code ---------------------------------- +Customization File Contents +--------------------------- -The Customization API is used to retrieve the analytics-code.html. See also :ref:`web-analytics-code` in the Configuration section of the Installation Guide. +The Customization API is used to retrieve the analytics-code.html as well as other customization file contents. See also :ref:`web-analytics-code` in the Configuration section of the Installation Guide. The content is returned in type="text/html; charset=UTF-8" +Valid types are "homePage", "header", "footer", "style", "analytics", and "logo". + A curl example getting the analytics-code .. code-block:: bash export SERVER_URL=https://demo.dataverse.org + export TYPE=analytics + + curl -X GET "$SERVER_URL/api/info/settings/customization/$TYPE" + +The fully expanded example above (without environment variables) looks like this: + +.. code-block:: bash - curl "$SERVER_URL/api/customization/analytics" + curl -X GET "https://demo.dataverse.org/api/info/settings/customization/analytics" .. _customization-analytics: diff --git a/src/main/java/edu/harvard/iq/dataverse/CustomizationFilesServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/CustomizationFilesServiceBean.java new file mode 100644 index 00000000000..b12bee4cce1 --- /dev/null +++ b/src/main/java/edu/harvard/iq/dataverse/CustomizationFilesServiceBean.java @@ -0,0 +1,91 @@ +package edu.harvard.iq.dataverse; + +import edu.harvard.iq.dataverse.customization.CustomizationConstants; +import edu.harvard.iq.dataverse.settings.SettingsServiceBean; +import jakarta.ejb.EJB; +import jakarta.ejb.Stateless; +import jakarta.inject.Named; +import org.apache.commons.io.IOUtils; + +import java.io.*; +import java.nio.file.Path; +import java.nio.file.Paths; +@Stateless +@Named +public class CustomizationFilesServiceBean { + + @EJB + SettingsServiceBean settingsService; + + public void getContents(PrintWriter writer, String fileType) { + Path physicalPath = Paths.get(getFilePath(fileType)); + FileInputStream inputStream = null; + BufferedReader in = null; + try { + File fileIn = physicalPath.toFile(); + if (fileIn != null) { + inputStream = new FileInputStream(fileIn); + in = new BufferedReader(new InputStreamReader(inputStream)); + StringBuilder responseData = new StringBuilder(); + String line; + while ((line = in.readLine()) != null) { + responseData.append(line); + writer.println(line); + } + inputStream.close(); + } else { + /* + If the file doesn't exist or it is unreadable we don't care + */ + } + + } catch (Exception e) { + /* + If the file doesn't exist, or it is unreadable we don't care + */ + } finally { + IOUtils.closeQuietly(inputStream); + IOUtils.closeQuietly(in); + } + + } + private String getFilePath(String fileTypeParam){ + + String nonNullDefaultIfKeyNotFound = ""; + + if (fileTypeParam.equals(CustomizationConstants.fileTypeHomePage)) { + + // Homepage + return settingsService.getValueForKey(SettingsServiceBean.Key.HomePageCustomizationFile, nonNullDefaultIfKeyNotFound); + + } else if (fileTypeParam.equals(CustomizationConstants.fileTypeHeader)) { + + // Header + return settingsService.getValueForKey(SettingsServiceBean.Key.HeaderCustomizationFile, nonNullDefaultIfKeyNotFound); + + } else if (fileTypeParam.equals(CustomizationConstants.fileTypeFooter)) { + + // Footer + return settingsService.getValueForKey(SettingsServiceBean.Key.FooterCustomizationFile, nonNullDefaultIfKeyNotFound); + + } else if (fileTypeParam.equals(CustomizationConstants.fileTypeStyle)) { + + // Style (css) + return settingsService.getValueForKey(SettingsServiceBean.Key.StyleCustomizationFile, nonNullDefaultIfKeyNotFound); + + } else if (fileTypeParam.equals(CustomizationConstants.fileTypeAnalytics)) { + + // Analytics - appears in head + return settingsService.getValueForKey(SettingsServiceBean.Key.WebAnalyticsCode, nonNullDefaultIfKeyNotFound); + + } else if (fileTypeParam.equals(CustomizationConstants.fileTypeLogo)) { + + // Logo for installation - appears in header + return settingsService.getValueForKey(SettingsServiceBean.Key.LogoCustomizationFile, nonNullDefaultIfKeyNotFound); + } + + + return ""; + } + +} diff --git a/src/main/java/edu/harvard/iq/dataverse/CustomizationFilesServlet.java b/src/main/java/edu/harvard/iq/dataverse/CustomizationFilesServlet.java index 9dd524127d7..0698fd33681 100644 --- a/src/main/java/edu/harvard/iq/dataverse/CustomizationFilesServlet.java +++ b/src/main/java/edu/harvard/iq/dataverse/CustomizationFilesServlet.java @@ -5,23 +5,13 @@ */ package edu.harvard.iq.dataverse; -import edu.harvard.iq.dataverse.customization.CustomizationConstants; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.nio.file.Path; -import java.nio.file.Paths; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import jakarta.ejb.EJB; -import org.apache.commons.io.IOUtils; /** * @@ -31,9 +21,8 @@ public class CustomizationFilesServlet extends HttpServlet { @EJB - SettingsServiceBean settingsService; - - + CustomizationFilesServiceBean customizationFilesService; + /** * Processes requests for both HTTP GET and POST * methods. @@ -48,85 +37,7 @@ protected void processRequest(HttpServletRequest request, HttpServletResponse re response.setContentType("text/html;charset=UTF-8"); String customFileType = request.getParameter("customFileType"); - String filePath = getFilePath(customFileType); - - Path physicalPath = Paths.get(filePath); - FileInputStream inputStream = null; - BufferedReader in = null; - try { - File fileIn = physicalPath.toFile(); - if (fileIn != null) { - inputStream = new FileInputStream(fileIn); - - in = new BufferedReader(new InputStreamReader(inputStream)); - String line; - - StringBuilder responseData = new StringBuilder(); - try (PrintWriter out = response.getWriter()) { - - while ((line = in.readLine()) != null) { - responseData.append(line); - out.println(line); - } - } - - inputStream.close(); - - - } else { - /* - If the file doesn't exist or it is unreadable we don't care - */ - } - - } catch (Exception e) { - /* - If the file doesn't exist or it is unreadable we don't care - */ - } finally { - IOUtils.closeQuietly(inputStream); - IOUtils.closeQuietly(in); - } - - } - - private String getFilePath(String fileTypeParam){ - - String nonNullDefaultIfKeyNotFound = ""; - - if (fileTypeParam.equals(CustomizationConstants.fileTypeHomePage)) { - - // Homepage - return settingsService.getValueForKey(SettingsServiceBean.Key.HomePageCustomizationFile, nonNullDefaultIfKeyNotFound); - - } else if (fileTypeParam.equals(CustomizationConstants.fileTypeHeader)) { - - // Header - return settingsService.getValueForKey(SettingsServiceBean.Key.HeaderCustomizationFile, nonNullDefaultIfKeyNotFound); - - } else if (fileTypeParam.equals(CustomizationConstants.fileTypeFooter)) { - - // Footer - return settingsService.getValueForKey(SettingsServiceBean.Key.FooterCustomizationFile, nonNullDefaultIfKeyNotFound); - - } else if (fileTypeParam.equals(CustomizationConstants.fileTypeStyle)) { - - // Style (css) - return settingsService.getValueForKey(SettingsServiceBean.Key.StyleCustomizationFile, nonNullDefaultIfKeyNotFound); - - } else if (fileTypeParam.equals(CustomizationConstants.fileTypeAnalytics)) { - - // Analytics - appears in head - return settingsService.getValueForKey(SettingsServiceBean.Key.WebAnalyticsCode, nonNullDefaultIfKeyNotFound); - - } else if (fileTypeParam.equals(CustomizationConstants.fileTypeLogo)) { - - // Logo for installation - appears in header - return settingsService.getValueForKey(SettingsServiceBean.Key.LogoCustomizationFile, nonNullDefaultIfKeyNotFound); - } - - - return ""; + customizationFilesService.getContents(response.getWriter(), customFileType); } // diff --git a/src/main/java/edu/harvard/iq/dataverse/api/CustomizationApi.java b/src/main/java/edu/harvard/iq/dataverse/api/CustomizationApi.java deleted file mode 100644 index 9ad586bea81..00000000000 --- a/src/main/java/edu/harvard/iq/dataverse/api/CustomizationApi.java +++ /dev/null @@ -1,29 +0,0 @@ -package edu.harvard.iq.dataverse.api; - -import edu.harvard.iq.dataverse.settings.SettingsServiceBean; -import jakarta.ejb.EJB; -import jakarta.ws.rs.*; -import jakarta.ws.rs.core.Response; - -@Path("customization") -public class CustomizationApi extends AbstractApiBean { - - @EJB - SettingsServiceBean settingsService; - - @GET - @Path("analytics") - @Produces({"text/html; charset=UTF-8"}) - public Response getAnalyticsHTML() { - return getFromSettings(SettingsServiceBean.Key.WebAnalyticsCode, "text/html; charset=UTF-8"); - } - - private Response getFromSettings(SettingsServiceBean.Key key, String type) { - String value = settingsService.getValueForKey(key); - if (value != null) { - return Response.ok(value).type(type).build(); - } else { - return Response.status(Response.Status.NOT_FOUND).build(); - } - } -} diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Info.java b/src/main/java/edu/harvard/iq/dataverse/api/Info.java index 7d84681afa5..138e81885a4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Info.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Info.java @@ -2,6 +2,8 @@ import java.io.FileInputStream; import java.io.InputStream; +import java.io.PrintWriter; +import java.io.StringWriter; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.Arrays; @@ -9,7 +11,8 @@ import java.util.logging.Level; import java.util.logging.Logger; -import jakarta.ws.rs.Produces; +import edu.harvard.iq.dataverse.CustomizationFilesServiceBean; +import jakarta.ws.rs.*; import org.apache.commons.io.IOUtils; import edu.harvard.iq.dataverse.export.ExportService; @@ -24,9 +27,6 @@ import jakarta.json.Json; import jakarta.json.JsonObjectBuilder; import jakarta.json.JsonValue; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.QueryParam; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import org.eclipse.microprofile.openapi.annotations.Operation; @@ -46,6 +46,9 @@ public class Info extends AbstractApiBean { @EJB SystemConfig systemConfig; + @EJB + CustomizationFilesServiceBean customizationFilesService; + private static final Logger logger = Logger.getLogger(Info.class.getCanonicalName()); @GET @@ -139,6 +142,20 @@ public Response getExportFormats() { return ok(responseModel); } + @GET + @Path("settings/customization/{customizationFileType}") + public Response getCustomizationFile(@PathParam("customizationFileType") String customizationFileType) { + StringWriter stringWriter = new StringWriter(); + PrintWriter printWriter = new PrintWriter(stringWriter); + customizationFilesService.getContents(printWriter, customizationFileType); + String contents = stringWriter.toString(); + if (contents != null && !contents.isEmpty()) { + return ok(contents); + } else { + return notFound(customizationFileType + " not set, or unknown."); + } + } + private Response getSettingResponseByKey(SettingsServiceBean.Key key) { String setting = settingsService.getValueForKey(key); if (setting != null) { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/CustomizationIT.java b/src/test/java/edu/harvard/iq/dataverse/api/CustomizationIT.java index 2effc36f752..71b20a81fea 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/CustomizationIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/CustomizationIT.java @@ -5,7 +5,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; -import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.*; public class CustomizationIT { @@ -13,32 +13,26 @@ public class CustomizationIT { public void after() { UtilIT.deleteSetting(SettingsServiceBean.Key.WebAnalyticsCode); } + @Test public void testGetCustomAnalytics() { - String html = """ - - - """; - - UtilIT.setSetting(SettingsServiceBean.Key.WebAnalyticsCode, html).prettyPrint(); - - Response getResponse = UtilIT.getCustomAnalyticsHTML(); + String setting = "./appserver/glassfish/domains/domain1/docroot/index.html"; + UtilIT.setSetting(SettingsServiceBean.Key.WebAnalyticsCode, setting).prettyPrint(); + + Response getResponse = UtilIT.getCustomizationFile("analytics"); getResponse.prettyPrint(); getResponse.then().assertThat() .statusCode(200) - .body(equalTo(html)); + .body(containsString("")); UtilIT.deleteSetting(SettingsServiceBean.Key.WebAnalyticsCode).prettyPrint(); - getResponse = UtilIT.getCustomAnalyticsHTML(); + getResponse = UtilIT.getCustomizationFile("analytics"); + getResponse.prettyPrint(); + getResponse.then().assertThat() + .statusCode(404); + + getResponse = UtilIT.getCustomizationFile("INVALID"); getResponse.prettyPrint(); getResponse.then().assertThat() .statusCode(404); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index b7e980bd90f..0681bb97bfe 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -4738,9 +4738,12 @@ public static Response updateDatasetFilesMetadata(String datasetIdOrPersistentId .post("/api/datasets/" + idInPath + "/files/metadata" + optionalQueryParam); } - public static Response getCustomAnalyticsHTML() { - return given() - .contentType("text/html; charset=UTF-8") - .get("/api/customization/analytics"); + public static Response getCustomizationFile(String fileType) { + RequestSpecification requestSpec = given(); + + Response resp = requestSpec.contentType("text/html; charset=UTF-8") + .get("/api/info/settings/customization/" + fileType); + + return resp; } } From ad8a4493713cb9cf60ef467430b75ebbb8bca09a Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Wed, 14 May 2025 10:17:41 +0200 Subject: [PATCH 043/470] feat: rename personOrOrg settings to kebab case (person-or-org) --- .../source/installation/config.rst | 22 ++++++++++++------- .../iq/dataverse/settings/JvmSettings.java | 6 ++--- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/doc/sphinx-guides/source/installation/config.rst b/doc/sphinx-guides/source/installation/config.rst index b0192a56997..cf021361a20 100644 --- a/doc/sphinx-guides/source/installation/config.rst +++ b/doc/sphinx-guides/source/installation/config.rst @@ -3083,22 +3083,26 @@ This setting is useful in cases such as running your Dataverse installation behi "HTTP_VIA", "REMOTE_ADDR" -.. _dataverse.personOrOrg.assumeCommaInPersonName: +.. _dataverse.person-or-org.assume-comma-in-person-name: -dataverse.personOrOrg.assumeCommaInPersonName -+++++++++++++++++++++++++++++++++++++++++++++ +dataverse.person-or-org.assume-comma-in-person-name ++++++++++++++++++++++++++++++++++++++++++++++++++++ Please note that this setting is experimental. The Schema.org metadata and OpenAIRE exports and the Schema.org metadata included in DatasetPages try to infer whether each entry in the various fields (e.g. Author, Contributor) is a Person or Organization. If you are sure that users are following the guidance to add people in the recommended family name, given name order, with a comma, you can set this true to always assume entries without a comma are for Organizations. The default is false. -Can also be set via *MicroProfile Config API* sources, e.g. the environment variable ``DATAVERSE_PERSONORORG_ASSUMECOMMAINPERSONNAME``. +``./asadmin create-jvm-options '-Ddataverse.person-or-org.assume-comma-in-person-name=true'`` -.. _dataverse.personOrOrg.orgPhraseArray: +Can also be set via *MicroProfile Config API* sources, e.g. the environment variable ``DATAVERSE_PERSON_OR_ORG_ASSUME_COMMA_IN_PERSON_NAME``. -dataverse.personOrOrg.orgPhraseArray -++++++++++++++++++++++++++++++++++++ +**Note:** This setting was previously called `dataverse.personOrOrg.assumeCommaInPersonName`, which is still available as an alias for backwards compatiblity. + +.. _dataverse.person-or-org.org-phrase-array: + +dataverse.person-or-org.org-phrase-array +++++++++++++++++++++++++++++++++++++++++ Please note that this setting is experimental. @@ -3106,7 +3110,9 @@ The Schema.org metadata and OpenAIRE exports and the Schema.org metadata include If you have examples where an orgization name is being inferred to belong to a person, you can use this setting to force it to be recognized as an organization. The value is expected to be a comma-separated list of strings. Any name that contains one of the strings is assumed to be an organization. For example, "Project" is a word that is not otherwise associated with being an organization. -Can also be set via *MicroProfile Config API* sources, e.g. the environment variable ``DATAVERSE_PERSONORORG_ORGPHRASEARRAY``. +Can also be set via *MicroProfile Config API* sources, e.g. the environment variable ``DATAVERSE_PERSON_OR_ORG_ORG_PHRASE_ARRAY``. + +**Note:** This setting was previously called `dataverse.personOrOrg.orgPhraseArray` and expected a JsonArray of strings. Please update both the name and value format if using the old setting. .. _dataverse.api.signature-secret: diff --git a/src/main/java/edu/harvard/iq/dataverse/settings/JvmSettings.java b/src/main/java/edu/harvard/iq/dataverse/settings/JvmSettings.java index cf5965eb122..e8a9bae41e0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/JvmSettings.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/JvmSettings.java @@ -265,9 +265,9 @@ public enum JvmSettings { CSL_COMMON_STYLES(SCOPE_CSL, "common-styles"), // PersonOrOrgUtil SETTINGS - SCOPE_PERSONORORG(PREFIX, "personOrOrg"), - ASSUME_COMMA_IN_PERSON_NAME(SCOPE_PERSONORORG, "assumeCommaInPersonName"), - ORG_PHRASE_ARRAY(SCOPE_PERSONORORG, "orgPhraseArray"), + SCOPE_PERSONORORG(PREFIX, "person-or-org", "dataverse.personOrOrg"), + ASSUME_COMMA_IN_PERSON_NAME(SCOPE_PERSONORORG, "assume-comma-in-person-name", "dataverse.personOrOrg.assumeCommaInPersonName"), + ORG_PHRASE_ARRAY(SCOPE_PERSONORORG, "org-phrase-array"), ; private static final String SCOPE_SEPARATOR = "."; From c33fd05e4eb9aa6b3cd5b6acbdf0d1c762534321 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Wed, 14 May 2025 10:18:01 +0200 Subject: [PATCH 044/470] docs: add release note for MPConfig migration of dataverse.personOrOrg settings --- doc/release-notes/11485-mpconfig-personororg.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 doc/release-notes/11485-mpconfig-personororg.md diff --git a/doc/release-notes/11485-mpconfig-personororg.md b/doc/release-notes/11485-mpconfig-personororg.md new file mode 100644 index 00000000000..c30ef3829c1 --- /dev/null +++ b/doc/release-notes/11485-mpconfig-personororg.md @@ -0,0 +1,7 @@ +The settings `dataverse.personOrOrg.assumeCommaInPersonName` and `dataverse.personOrOrg.orgPhraseArray` now support configuration via MicroProfile Config. + +They have been renamed to `dataverse.person-or-org.assume-comma-in-person-name` and `dataverse.person-or-org.org-phrase-array` for consistency with naming conventions. + +In addition to the existing `asadmin` JVM option method, any [supported MicroProfile Config API source](https://docs.payara.fish/community/docs/Technical%20Documentation/MicroProfile/Config/Overview.html) can now be used to set their values. + +For backwards compatibility, `dataverse.personOrOrg.assumeCommaInPersonName` is still supported. However, `dataverse.personOrOrg.orgPhraseArray` is not, due to a change in the expected value format. `dataverse.person-or-org.org-phrase-array` now expects a comma-separated list of phrases as a value instead of a JsonArray of strings. Please update both the name and value format if using the old setting. \ No newline at end of file From 246535c835590a43031e1be894d994d012fb4290 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Thu, 15 May 2025 11:49:24 +0200 Subject: [PATCH 045/470] feat: allow listing links of a dataset for non-superusers --- .../harvard/iq/dataverse/api/Datasets.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index 0999408a977..5cbc1b60c89 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -2022,20 +2022,23 @@ public Response getCustomTermsTab(@PathParam("id") String id, @PathParam("versio public Response getLinks(@Context ContainerRequestContext crc, @PathParam("id") String idSupplied ) { try { User u = getRequestUser(crc); - if (!u.isSuperuser()) { - return error(Response.Status.FORBIDDEN, "Not a superuser"); - } Dataset dataset = findDatasetOrDie(idSupplied); + if (!dataset.isReleased() && !permissionService.hasPermissionsFor(u, dataset.getOwner(), EnumSet.of(Permission.ViewUnpublishedDataset))) { + return error(Response.Status.FORBIDDEN, "User is not allowed to list the link(s) of this dataset"); + } + long datasetId = dataset.getId(); List dvsThatLinkToThisDatasetId = dataverseSvc.findDataversesThatLinkToThisDatasetId(datasetId); JsonArrayBuilder dataversesThatLinkToThisDatasetIdBuilder = Json.createArrayBuilder(); for (Dataverse dataverse : dvsThatLinkToThisDatasetId) { - JsonObjectBuilder datasetBuilder = Json.createObjectBuilder(); - datasetBuilder.add("id", dataverse.getId()); - datasetBuilder.add("alias", dataverse.getAlias()); - datasetBuilder.add("displayName", dataverse.getDisplayName()); - dataversesThatLinkToThisDatasetIdBuilder.add(datasetBuilder.build()); + if (dataverse.isReleased() || this.permissionService.hasPermissionsFor(u, dataverse, EnumSet.of(Permission.ViewUnpublishedDataverse))) { + JsonObjectBuilder datasetBuilder = Json.createObjectBuilder(); + datasetBuilder.add("id", dataverse.getId()); + datasetBuilder.add("alias", dataverse.getAlias()); + datasetBuilder.add("displayName", dataverse.getDisplayName()); + dataversesThatLinkToThisDatasetIdBuilder.add(datasetBuilder.build()); + } } JsonObjectBuilder response = Json.createObjectBuilder(); response.add("id", datasetId); From 7e8180d6a73e9fcc1aa35bb2ecc2743e365a8b98 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Thu, 15 May 2025 11:49:52 +0200 Subject: [PATCH 046/470] test: add test for listing links of a dataset --- .../edu/harvard/iq/dataverse/api/LinkIT.java | 103 +++++++++++++++++- 1 file changed, 99 insertions(+), 4 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java b/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java index 2f46960f9a8..7202972141e 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java @@ -4,13 +4,18 @@ import io.restassured.path.json.JsonPath; import io.restassured.response.Response; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; import java.util.logging.Logger; -import static jakarta.ws.rs.core.Response.Status.CREATED; -import static jakarta.ws.rs.core.Response.Status.FORBIDDEN; -import static jakarta.ws.rs.core.Response.Status.OK; + +import static jakarta.ws.rs.core.Response.Status.*; import static org.hamcrest.CoreMatchers.equalTo; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -199,4 +204,94 @@ public void testDeepLinks() { } + @Test + public void testListLinks() { + + Response createUser1 = UtilIT.createRandomUser(); + createUser1.prettyPrint(); + createUser1.then().assertThat() + .statusCode(OK.getStatusCode()); + String apiToken1 = UtilIT.getApiTokenFromResponse(createUser1); + + Response createUser2 = UtilIT.createRandomUser(); + createUser2.prettyPrint(); + createUser2.then().assertThat() + .statusCode(OK.getStatusCode()); + String username2 = UtilIT.getUsernameFromResponse(createUser2); + String apiToken2 = UtilIT.getApiTokenFromResponse(createUser2); + + // Create dataverse1 which both user1 and user2 have admin access to + Response createDataverse1 = UtilIT.createRandomDataverse(apiToken1); + createDataverse1.prettyPrint(); + createDataverse1.then().assertThat() + .statusCode(CREATED.getStatusCode()); + String dataverse1Alias = UtilIT.getAliasFromResponse(createDataverse1); + + Response grantUser2AccessOnDataverse = UtilIT.grantRoleOnDataverse(dataverse1Alias, "admin", "@" + username2, apiToken1); + grantUser2AccessOnDataverse.prettyPrint(); + grantUser2AccessOnDataverse.then().assertThat() + .statusCode(OK.getStatusCode()); + + // Create dataset in dataverse1 + Response createDataset = UtilIT.createRandomDatasetViaNativeApi(dataverse1Alias, apiToken1); + createDataset.prettyPrint(); + createDataset.then().assertThat() + .statusCode(CREATED.getStatusCode()); + String datasetPid = JsonPath.from(createDataset.asString()).getString("data.persistentId"); + + // Create another unpublished dataverse2 as user2, and don't grant user1 any permissions on it + // Which means that user1 should not have permission to view this dataverse before it is published + Response createDataverse2 = UtilIT.createRandomDataverse(apiToken2); + createDataverse2.prettyPrint(); + createDataverse2.then().assertThat() + .statusCode(CREATED.getStatusCode()); + String dataverse2Alias = UtilIT.getAliasFromResponse(createDataverse2); + Integer dataverse2Id = UtilIT.getDatasetIdFromResponse(createDataverse2); + + // User1 doesn't have permission to link the dataset to the unpublished dataverse2 + Response tryToLinkToUnpublishedDataverseResponse = UtilIT.linkDataset(datasetPid, dataverse2Alias, apiToken1); + tryToLinkToUnpublishedDataverseResponse.prettyPrint(); + tryToLinkToUnpublishedDataverseResponse.then().assertThat() + .statusCode(UNAUTHORIZED.getStatusCode()); + + // But user2 does have permission to link the dataset to his own unpublished dataverse2 + Response linkDatasetToUnpublishedDataverseResponse = UtilIT.linkDataset(datasetPid, dataverse2Alias, apiToken2); + linkDatasetToUnpublishedDataverseResponse.prettyPrint(); + linkDatasetToUnpublishedDataverseResponse.then().assertThat() + .statusCode(OK.getStatusCode()); + + // User1 has permission to list the links of the dataset, but cannot see the link to the unpublished dataverse2 + Response linkDatasetsResponse = UtilIT.getDatasetLinks(datasetPid, apiToken1); + linkDatasetsResponse.prettyPrint(); + linkDatasetsResponse.then().assertThat() + .statusCode(OK.getStatusCode()); + JsonObject linkDatasets = Json.createReader(new StringReader(linkDatasetsResponse.asString())).readObject(); + JsonArray linksList = linkDatasets.getJsonObject("data").getJsonArray("linked-dataverses"); + assertEquals(0, linksList.size()); + + // User2 has permission to list the links of the dataset and can see the link to the unpublished dataverse2 + Response linkDatasetsResponse2 = UtilIT.getDatasetLinks(datasetPid, apiToken2); + linkDatasetsResponse2.prettyPrint(); + linkDatasetsResponse2.then().assertThat() + .statusCode(OK.getStatusCode()); + JsonObject linkDatasets2 = Json.createReader(new StringReader(linkDatasetsResponse2.asString())).readObject(); + JsonArray linksList2 = linkDatasets2.getJsonObject("data").getJsonArray("linked-dataverses"); + assertEquals(1, linksList2.size()); + assertEquals(dataverse2Id, linksList2.getJsonObject(0).getInt("id")); + + UtilIT.publishDataverseViaNativeApi(dataverse2Alias, apiToken2).then().assertThat() + .statusCode(OK.getStatusCode()); + + // After publishing dataverse2, user1 can now also see the link + Response linkDatasetsResponse3 = UtilIT.getDatasetLinks(datasetPid, apiToken1); + linkDatasetsResponse3.prettyPrint(); + linkDatasetsResponse3.then().assertThat() + .statusCode(OK.getStatusCode()); + JsonObject linkDatasets3 = Json.createReader(new StringReader(linkDatasetsResponse3.asString())).readObject(); + JsonArray linksList3 = linkDatasets3.getJsonObject("data").getJsonArray("linked-dataverses"); + assertEquals(1, linksList3.size()); + assertEquals(dataverse2Id, linksList3.getJsonObject(0).getInt("id")); + + } + } From 1b3fdcc0697ad9ec2c470cf21225d602c05ff731 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Thu, 15 May 2025 12:58:59 +0200 Subject: [PATCH 047/470] test: extend test for listing links of a dataset --- .../edu/harvard/iq/dataverse/api/LinkIT.java | 61 ++++++++++++++++++- .../edu/harvard/iq/dataverse/api/UtilIT.java | 10 +-- 2 files changed, 64 insertions(+), 7 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java b/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java index 7202972141e..691d820b511 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java @@ -220,19 +220,23 @@ public void testListLinks() { String username2 = UtilIT.getUsernameFromResponse(createUser2); String apiToken2 = UtilIT.getApiTokenFromResponse(createUser2); - // Create dataverse1 which both user1 and user2 have admin access to + // Create and publish dataverse1 which both user1 and user2 have admin access to Response createDataverse1 = UtilIT.createRandomDataverse(apiToken1); createDataverse1.prettyPrint(); createDataverse1.then().assertThat() .statusCode(CREATED.getStatusCode()); String dataverse1Alias = UtilIT.getAliasFromResponse(createDataverse1); + UtilIT.publishDataverseViaNativeApi(dataverse1Alias, apiToken1).then().assertThat() + .statusCode(OK.getStatusCode()); + Response grantUser2AccessOnDataverse = UtilIT.grantRoleOnDataverse(dataverse1Alias, "admin", "@" + username2, apiToken1); grantUser2AccessOnDataverse.prettyPrint(); grantUser2AccessOnDataverse.then().assertThat() .statusCode(OK.getStatusCode()); - // Create dataset in dataverse1 + // Create unpublished dataset in dataverse1 + // Which means that both user1 and user2 have permission to view it Response createDataset = UtilIT.createRandomDatasetViaNativeApi(dataverse1Alias, apiToken1); createDataset.prettyPrint(); createDataset.then().assertThat() @@ -240,7 +244,7 @@ public void testListLinks() { String datasetPid = JsonPath.from(createDataset.asString()).getString("data.persistentId"); // Create another unpublished dataverse2 as user2, and don't grant user1 any permissions on it - // Which means that user1 should not have permission to view this dataverse before it is published + // Which means that user1 doesn't have permission to view this dataverse before it is published Response createDataverse2 = UtilIT.createRandomDataverse(apiToken2); createDataverse2.prettyPrint(); createDataverse2.then().assertThat() @@ -292,6 +296,57 @@ public void testListLinks() { assertEquals(1, linksList3.size()); assertEquals(dataverse2Id, linksList3.getJsonObject(0).getInt("id")); + // Create user3 without permissions on the unpublished dataset + Response createUser3 = UtilIT.createRandomUser(); + createUser3.prettyPrint(); + createUser3.then().assertThat() + .statusCode(OK.getStatusCode()); + String username3 = UtilIT.getUsernameFromResponse(createUser3); + String apiToken3 = UtilIT.getApiTokenFromResponse(createUser3); + + // User3 cannot list the links of the unpublished dataset + Response linkDatasetsResponse4 = UtilIT.getDatasetLinks(datasetPid, apiToken3); + linkDatasetsResponse4.prettyPrint(); + linkDatasetsResponse4.then().assertThat() + .statusCode(FORBIDDEN.getStatusCode()); + + // Grant user3 "member" role on dataverse1, which allows viewing unpublished datasets + Response grantUser3AccessOnDataverse = UtilIT.grantRoleOnDataverse(dataverse1Alias, "member", "@" + username3, apiToken1); + grantUser3AccessOnDataverse.prettyPrint(); + grantUser3AccessOnDataverse.then().assertThat() + .statusCode(OK.getStatusCode()); + + // User 3 can now also list the links + Response linkDatasetsResponse5 = UtilIT.getDatasetLinks(datasetPid, apiToken3); + linkDatasetsResponse5.prettyPrint(); + linkDatasetsResponse5.then().assertThat() + .statusCode(OK.getStatusCode()); + JsonObject linkDatasets5 = Json.createReader(new StringReader(linkDatasetsResponse5.asString())).readObject(); + JsonArray linksList5 = linkDatasets5.getJsonObject("data").getJsonArray("linked-dataverses"); + assertEquals(1, linksList5.size()); + assertEquals(dataverse2Id, linksList5.getJsonObject(0).getInt("id")); + + // Non-authenticated user cannot list the links of the unpublished dataset + Response linkDatasetsResponse6 = UtilIT.getDatasetLinks(datasetPid, null); + linkDatasetsResponse6.prettyPrint(); + linkDatasetsResponse6.then().assertThat() + .statusCode(FORBIDDEN.getStatusCode()); + + Response publishDatasetResponse = UtilIT.publishDatasetViaNativeApi(datasetPid, "major", apiToken1); + publishDatasetResponse.prettyPrint(); + publishDatasetResponse.then().assertThat() + .statusCode(OK.getStatusCode()); + + // After publishing the dataset, non-authenticated user can now also see the link + Response linkDatasetsResponse7 = UtilIT.getDatasetLinks(datasetPid, null); + linkDatasetsResponse7.prettyPrint(); + linkDatasetsResponse7.then().assertThat() + .statusCode(OK.getStatusCode()); + JsonObject linkDatasets7 = Json.createReader(new StringReader(linkDatasetsResponse7.asString())).readObject(); + JsonArray linksList7 = linkDatasets7.getJsonObject("data").getJsonArray("linked-dataverses"); + assertEquals(1, linksList7.size()); + assertEquals(dataverse2Id, linksList7.getJsonObject(0).getInt("id")); + } } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index bd54da22f43..10bea5102c3 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -2053,10 +2053,12 @@ static Response linkDataset(String datasetToLinkPid, String dataverseAlias, Stri } static Response getDatasetLinks(String datasetToLinkPid, String apiToken) { - Response response = given() - .header(API_TOKEN_HTTP_HEADER, apiToken) - .get("api/datasets/:persistentId/links" + "?persistentId=" + datasetToLinkPid); - return response; + RequestSpecification requestSpecification = given(); + if (apiToken != null) { + requestSpecification = given() + .header(UtilIT.API_TOKEN_HTTP_HEADER, apiToken); + } + return requestSpecification.get("api/datasets/:persistentId/links" + "?persistentId=" + datasetToLinkPid); } static Response createDataverseLink(String linkedDataverseAlias, String linkingDataverseAlias, String apiToken) { From e5fd1339fdaf5bdd9ee67347bc04739fef3ae5cc Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Thu, 15 May 2025 12:59:49 +0200 Subject: [PATCH 048/470] docs: add release note for #11492 --- doc/release-notes/11492-list-dataset-links.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/release-notes/11492-list-dataset-links.md diff --git a/doc/release-notes/11492-list-dataset-links.md b/doc/release-notes/11492-list-dataset-links.md new file mode 100644 index 00000000000..0a5a6f7a198 --- /dev/null +++ b/doc/release-notes/11492-list-dataset-links.md @@ -0,0 +1 @@ +The [API for listing the collections a dataset has been linked to](https://guides.dataverse.org/en/latest/admin/dataverses-datasets.html#list-collections-that-are-linked-from-a-dataset) (`api/datasets/$linked-dataset-id/links`) is no longer restricted to superusers. For unpublished datasets, users need the "View Unpublished Dataset" permission to access the API. Unpublished collections in the list require the "View Unpublished Dataverse" permission; otherwise, they are hidden. \ No newline at end of file From 97ef00b2e6494525b3c70d30047fe2446ea7e426 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Fri, 16 May 2025 16:04:58 +0200 Subject: [PATCH 049/470] fix: fix permission check when listing links of dataset --- src/main/java/edu/harvard/iq/dataverse/api/Datasets.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index 5cbc1b60c89..725013e5bae 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -2024,7 +2024,7 @@ public Response getLinks(@Context ContainerRequestContext crc, @PathParam("id") User u = getRequestUser(crc); Dataset dataset = findDatasetOrDie(idSupplied); - if (!dataset.isReleased() && !permissionService.hasPermissionsFor(u, dataset.getOwner(), EnumSet.of(Permission.ViewUnpublishedDataset))) { + if (!dataset.isReleased() && !permissionService.hasPermissionsFor(u, dataset, EnumSet.of(Permission.ViewUnpublishedDataset))) { return error(Response.Status.FORBIDDEN, "User is not allowed to list the link(s) of this dataset"); } From 999e426a6e394422f6b8a0d71e79a4565a3db65a Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Fri, 16 May 2025 16:05:15 +0200 Subject: [PATCH 050/470] test: fix test for listing links of dataset --- .../edu/harvard/iq/dataverse/api/LinkIT.java | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java b/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java index 691d820b511..65b68e62d22 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/LinkIT.java @@ -235,7 +235,7 @@ public void testListLinks() { grantUser2AccessOnDataverse.then().assertThat() .statusCode(OK.getStatusCode()); - // Create unpublished dataset in dataverse1 + // Create and publish dataset in dataverse1 // Which means that both user1 and user2 have permission to view it Response createDataset = UtilIT.createRandomDatasetViaNativeApi(dataverse1Alias, apiToken1); createDataset.prettyPrint(); @@ -243,6 +243,11 @@ public void testListLinks() { .statusCode(CREATED.getStatusCode()); String datasetPid = JsonPath.from(createDataset.asString()).getString("data.persistentId"); + Response publishDatasetResponse = UtilIT.publishDatasetViaNativeApi(datasetPid, "major", apiToken1); + publishDatasetResponse.prettyPrint(); + publishDatasetResponse.then().assertThat() + .statusCode(OK.getStatusCode()); + // Create another unpublished dataverse2 as user2, and don't grant user1 any permissions on it // Which means that user1 doesn't have permission to view this dataverse before it is published Response createDataverse2 = UtilIT.createRandomDataverse(apiToken2); @@ -296,6 +301,13 @@ public void testListLinks() { assertEquals(1, linksList3.size()); assertEquals(dataverse2Id, linksList3.getJsonObject(0).getInt("id")); + // Create another dataset, but don't publish it + Response createDataset2 = UtilIT.createRandomDatasetViaNativeApi(dataverse1Alias, apiToken1); + createDataset2.prettyPrint(); + createDataset2.then().assertThat() + .statusCode(CREATED.getStatusCode()); + String dataset2Pid = JsonPath.from(createDataset2.asString()).getString("data.persistentId"); + // Create user3 without permissions on the unpublished dataset Response createUser3 = UtilIT.createRandomUser(); createUser3.prettyPrint(); @@ -305,7 +317,7 @@ public void testListLinks() { String apiToken3 = UtilIT.getApiTokenFromResponse(createUser3); // User3 cannot list the links of the unpublished dataset - Response linkDatasetsResponse4 = UtilIT.getDatasetLinks(datasetPid, apiToken3); + Response linkDatasetsResponse4 = UtilIT.getDatasetLinks(dataset2Pid, apiToken3); linkDatasetsResponse4.prettyPrint(); linkDatasetsResponse4.then().assertThat() .statusCode(FORBIDDEN.getStatusCode()); @@ -317,35 +329,34 @@ public void testListLinks() { .statusCode(OK.getStatusCode()); // User 3 can now also list the links - Response linkDatasetsResponse5 = UtilIT.getDatasetLinks(datasetPid, apiToken3); + Response linkDatasetsResponse5 = UtilIT.getDatasetLinks(dataset2Pid, apiToken3); linkDatasetsResponse5.prettyPrint(); linkDatasetsResponse5.then().assertThat() .statusCode(OK.getStatusCode()); JsonObject linkDatasets5 = Json.createReader(new StringReader(linkDatasetsResponse5.asString())).readObject(); JsonArray linksList5 = linkDatasets5.getJsonObject("data").getJsonArray("linked-dataverses"); - assertEquals(1, linksList5.size()); - assertEquals(dataverse2Id, linksList5.getJsonObject(0).getInt("id")); + assertEquals(0, linksList5.size()); // Non-authenticated user cannot list the links of the unpublished dataset - Response linkDatasetsResponse6 = UtilIT.getDatasetLinks(datasetPid, null); + Response linkDatasetsResponse6 = UtilIT.getDatasetLinks(dataset2Pid, null); linkDatasetsResponse6.prettyPrint(); linkDatasetsResponse6.then().assertThat() .statusCode(FORBIDDEN.getStatusCode()); - Response publishDatasetResponse = UtilIT.publishDatasetViaNativeApi(datasetPid, "major", apiToken1); - publishDatasetResponse.prettyPrint(); - publishDatasetResponse.then().assertThat() + // Publish dataset2 + Response publishDataset2Response = UtilIT.publishDatasetViaNativeApi(dataset2Pid, "major", apiToken1); + publishDataset2Response.prettyPrint(); + publishDataset2Response.then().assertThat() .statusCode(OK.getStatusCode()); - // After publishing the dataset, non-authenticated user can now also see the link - Response linkDatasetsResponse7 = UtilIT.getDatasetLinks(datasetPid, null); + // After publishing the dataset, non-authenticated user can now also list the links + Response linkDatasetsResponse7 = UtilIT.getDatasetLinks(dataset2Pid, null); linkDatasetsResponse7.prettyPrint(); linkDatasetsResponse7.then().assertThat() .statusCode(OK.getStatusCode()); JsonObject linkDatasets7 = Json.createReader(new StringReader(linkDatasetsResponse7.asString())).readObject(); JsonArray linksList7 = linkDatasets7.getJsonObject("data").getJsonArray("linked-dataverses"); - assertEquals(1, linksList7.size()); - assertEquals(dataverse2Id, linksList7.getJsonObject(0).getInt("id")); + assertEquals(0, linksList7.size()); } From 16c0055829b76d345cdc927c3d3dd962b40395e0 Mon Sep 17 00:00:00 2001 From: Leonid Andreev Date: Fri, 16 May 2025 13:03:37 -0400 Subject: [PATCH 051/470] This is a working implementation of shibboleth logins by means of the new InCommon Wayfinder service. Before I make a pr, I want to put back a DiscoFeed-based login workflow, as a configurable option, just in case some instance out there has a reason to keep using it. #11404 --- .../edu/harvard/iq/dataverse/LoginPage.java | 18 +++- ...ationProvidersRegistrationServiceBean.java | 97 ++++++++++++++++++- .../shib/ShibAuthenticationProvider.java | 15 +++ .../providers/shib/ShibServiceBean.java | 69 ++++++++++++- src/main/webapp/loginpage.xhtml | 2 +- 5 files changed, 189 insertions(+), 12 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/LoginPage.java b/src/main/java/edu/harvard/iq/dataverse/LoginPage.java index f7ccc202470..0a6ba3e6210 100644 --- a/src/main/java/edu/harvard/iq/dataverse/LoginPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/LoginPage.java @@ -9,6 +9,7 @@ import edu.harvard.iq.dataverse.authorization.exceptions.AuthenticationFailedException; import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinAuthenticationProvider; import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUserServiceBean; +import edu.harvard.iq.dataverse.authorization.providers.shib.ShibServiceBean; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.BundleUtil; @@ -92,6 +93,9 @@ public enum EditMode {LOGIN, SUCCESS, FAILED}; @EJB SystemConfig systemConfig; + @EJB + ShibServiceBean shibService; + @Inject DataverseRequestServiceBean dvRequestService; @@ -255,10 +259,16 @@ public void setRedirectPage(String redirectPage) { this.redirectPage = redirectPage; } - public String getShibAuthRedirect() { - String hardCodedWayFinderUrl = "https://wayfinder.incommon.org/?entityID=https%3A%2F%2Fdataverse6.rdmc.unc.edu&return=https%3A%2F%2Fdataverse6.rdmc.unc.edu%2FShibboleth.sso%2FLogin%3FSAMLDS%3D1%2526target%3Dhttps%3A%2F%2Fdataverse6.rdmc.unc.edu%2Fshib.xhtml%253FredirectPage%253D%25252Fdataverse.xhtml"; - //String hardCodedWayFinderUrl = "https://wayfinder.incommon.org/?entityID=https%3A%2F%2Fdemo.dataverse.org%2Fsp&return=https%3A%2F%2Fdemo.dataverse.org%2FShibboleth.sso%2FLogin%3FSAMLDS%3D1%2526target%3Dhttps%3A%2F%2Fdemo.dataverse.org%2Fshib.xhtml%253FredirectPage%253D%25252Fdataverse.xhtml"; - return hardCodedWayFinderUrl; + public String getShibWayfinderRedirect() { + String wayFinderUrl = shibService.getWayfinderRedirectUrl(); + logger.fine("wayfinder url provided by the shib service: " + wayFinderUrl); + // In order to produce a complete url, we need to add the final redirect + // parameter (this will be the FOURTH redirect in the shib. authentication + // loop), the redirectPage= pointing to the final destination Dataverse + // page. Note the corresponding multiple-level URL encoding involved. + String finalRedirectUrl = wayFinderUrl + "%253FredirectPage%253D" + getRedirectPage().replaceAll("/", "%25252F"); + logger.fine("final redirect url: " + finalRedirectUrl); + return finalRedirectUrl; } public AuthenticationProvider getAuthProvider() { diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvidersRegistrationServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvidersRegistrationServiceBean.java index 1dfd7bdb713..c7c0880bdf2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvidersRegistrationServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvidersRegistrationServiceBean.java @@ -17,8 +17,11 @@ import edu.harvard.iq.dataverse.authorization.providers.oauth2.OAuth2AuthenticationProviderFactory; import edu.harvard.iq.dataverse.authorization.providers.oauth2.impl.OrcidOAuth2AP; import edu.harvard.iq.dataverse.authorization.providers.oauth2.oidc.OIDCAuthenticationProviderFactory; +import edu.harvard.iq.dataverse.authorization.providers.shib.ShibAuthenticationProvider; import edu.harvard.iq.dataverse.authorization.providers.shib.ShibAuthenticationProviderFactory; +import edu.harvard.iq.dataverse.authorization.providers.shib.ShibServiceBean; import edu.harvard.iq.dataverse.settings.JvmSettings; +import edu.harvard.iq.dataverse.util.SystemConfig; import edu.harvard.iq.dataverse.validation.PasswordValidatorServiceBean; import java.util.HashMap; import java.util.Map; @@ -33,6 +36,18 @@ import jakarta.inject.Named; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; /** * @@ -62,7 +77,7 @@ public class AuthenticationProvidersRegistrationServiceBean { @EJB AuthenticationServiceBean authenticationService; - + /** * The maps below (the objects themselves) are "final", but the * values will be populated in @PostConstruct (see below) during @@ -117,7 +132,23 @@ public void startup() { .getResultList().forEach((row) -> { if(row.isEnabled()) { try { - registerProvider( loadProvider(row) ); + AuthenticationProvider authProvider = loadProvider(row); + + registerProvider( authProvider ); + + // For shibboleth specifically, we will call shibd to + // look up and cache its EntityId: + + if ("shib".equals(authProvider.getId())) { + String spEntityId = lookupShibbolethEntityId(); + logger.info("Looked up the entityId of the shibboleth service provider (via a call to shibd): " + +spEntityId); + if (spEntityId == null) { + // we'll make this educated guess - it may or may not help us later on: + spEntityId = SystemConfig.getDataverseSiteUrlStatic() + "/sp"; + } + ((ShibAuthenticationProvider)authProvider).setServiceProviderEntityId(spEntityId); + } } catch ( AuthenticationProviderFactoryNotFoundException e ) { logger.log(Level.SEVERE, "Cannot find authentication provider factory with alias '" + e.getFactoryAlias() + "'",e); @@ -307,5 +338,67 @@ public boolean isOrcidEnabled() { return oAuth2authenticationProviders.values().stream().anyMatch( s -> s.getId().toLowerCase().contains("orcid") ); } */ + + private String lookupShibbolethEntityId() { + + String urlString = SystemConfig.getDataverseSiteUrlStatic() + "/Shibboleth.sso/Metadata"; + URL url = null; + try { + url = new URL(urlString); + } catch (MalformedURLException ex) { + logger.warning(ex.toString()); + return null; + } + + if (url == null) { + logger.warning("url object was null after parsing " + urlString); + return null; + } + + HttpURLConnection metadataRequest = null; + try { + metadataRequest = (HttpURLConnection) url.openConnection(); + } catch (IOException ex) { + logger.warning(ex.toString()); + return null; + } + if (metadataRequest == null) { + logger.warning("http request was null for a local /Shibboleth.sso/Metadata call"); + return null; + } + try { + metadataRequest.connect(); + } catch (IOException ex) { + logger.warning(ex.toString()); + return null; + } + + XMLStreamReader xmlr = null; + + try { + XMLInputFactory xmlFactory = javax.xml.stream.XMLInputFactory.newInstance(); + xmlr = xmlFactory.createXMLStreamReader(new InputStreamReader((InputStream) metadataRequest.getInputStream())); + + while ( xmlr.next() == XMLStreamConstants.COMMENT); + xmlr.require(XMLStreamConstants.START_ELEMENT, null, "EntityDescriptor"); + + return xmlr.getAttributeValue(null, "entityID"); + + } catch (IOException ioex) { + logger.warning("IOException instantiating a stream reader of the /Shibboleth.sso/Metadata output" + ioex.getMessage()); + } catch (XMLStreamException xsex) { + logger.warning("Failed to parse the xml output of the /Shibboleth.sso/Metadata; " + xsex.getMessage()); + } finally { + if (xmlr != null) { + try { + logger.fine("closing xml reader"); + xmlr.close(); + } catch (XMLStreamException xsex) { + // we don't care + } + } + } + return null; + } } diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibAuthenticationProvider.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibAuthenticationProvider.java index 0f6be352ed9..cb11b748f49 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibAuthenticationProvider.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibAuthenticationProvider.java @@ -31,5 +31,20 @@ public boolean isOAuthProvider() { // We don't override "isEmailVerified" because we're using timestamps // ("emailconfirmed" on the "authenticateduser" table) to know if // Shib users have confirmed/verified their email or not. + + /* + * Specific to Shibboleth auth, the provider needs to know the entityId of + * itself as a Shibboleth "service provider" - the registered identifier + * of shibd running on the same host. + */ + private String serviceProviderEntityId = null; + + public String getServiceProviderEntityId() { + return serviceProviderEntityId; + } + + public void setServiceProviderEntityId(String serviceProviderEntityId) { + this.serviceProviderEntityId = serviceProviderEntityId; + } } diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java index 5170f5ecd3b..51cd28614d1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java @@ -50,6 +50,7 @@ public class ShibServiceBean { private static final String INCOMMON_MDQ_API_BASE = "https://mdq.incommon.org"; private static final String INCOMMON_MDQ_API_ENTITIES_URL = INCOMMON_MDQ_API_BASE + "/entities/"; + private static final String INCOMMON_WAYFINDER_URL = "https://wayfinder.incommon.org"; /** * "Production" means "don't mess with the HTTP request". @@ -177,10 +178,14 @@ public String getAffiliation(String shibIdp, DevShibAccountType devShibAccountTy if (!devShibAccountType.equals(DevShibAccountType.PRODUCTION)) { return getAffiliationFromDiscoFeed(shibIdp, devShibAccountType); } + return getAffiliationViaMDQ(shibIdp); + } + + public String getAffiliationViaMDQ(String shibIdp) { String entityIdEncoded = URLEncoder.encode(shibIdp, StandardCharsets.UTF_8); String apiUrl = INCOMMON_MDQ_API_ENTITIES_URL + entityIdEncoded; //"https://mdq.incommon.org/entities/https%3A%2F%2Ffed.huit.harvard.edu%2Fidp%2Fshibboleth" - logger.info("cooked Incommon MDQ url: " + apiUrl); + logger.fine("cooked Incommon MDQ url: " + apiUrl); URL url = null; try { @@ -190,7 +195,7 @@ public String getAffiliation(String shibIdp, DevShibAccountType devShibAccountTy return null; } if (url == null) { - logger.warning("url object was null after parsing " + apiUrl); + logger.warning("MDQ url object was null after parsing " + apiUrl); return null; } @@ -219,7 +224,6 @@ public String getAffiliation(String shibIdp, DevShibAccountType devShibAccountTy xmlr = xmlFactory.createXMLStreamReader(new InputStreamReader((InputStream) mdqApiRequest.getInputStream())); while ( xmlr.next() == XMLStreamConstants.COMMENT ); - //xmlr.nextTag(); xmlr.require(XMLStreamConstants.START_ELEMENT, null, "EntityDescriptor"); while (xmlr.hasNext()) { @@ -228,7 +232,7 @@ public String getAffiliation(String shibIdp, DevShibAccountType devShibAccountTy if (event == XMLStreamConstants.START_ELEMENT) { String currentElement = xmlr.getLocalName(); - if ("OrganizationDisplayName".equals(currentElement)) { + if ("".equals(currentElement)) { int eventType = xmlr.next(); if (eventType == XMLStreamConstants.CHARACTERS) { String affiliation = xmlr.getText(); @@ -251,7 +255,7 @@ public String getAffiliation(String shibIdp, DevShibAccountType devShibAccountTy } finally { if (xmlr != null) { try { - logger.info("closing xml reader"); + logger.fine("closing xml reader"); xmlr.close(); } catch (XMLStreamException xsex) { // do we care? @@ -263,6 +267,13 @@ public String getAffiliation(String shibIdp, DevShibAccountType devShibAccountTy return null; } + /* + * This is the old-style method of obtaining the affiliation - by calling + * the DiscoFeed, provided by the locally-running shibd instance, finding + * the provider in the full json-formatted list and selecting its "display + * name". It is kept in the code for now, under the assumption that somebody + * may still have reasons to keep using the DiscoFeed-based model. + **/ public String getAffiliationFromDiscoFeed(String shibIdp, DevShibAccountType devShibAccountType) { JsonArray emptyJsonArray = new JsonArray(); String discoFeedJson = emptyJsonArray.toString(); @@ -330,6 +341,54 @@ public String getAffiliationFromDiscoFeed(String shibIdp, DevShibAccountType dev } } + /* + * The redirect URL for initiating the Shibboleth authentication redirect + * loop using the new InCommon WayFinder service. There are four redirects + * total in a succesfully completed workflow: + * -> Wayfinder -> local shibd -> shib.xhtml -> final Dataverse page + * all four of the above steps are encoded in the initial redirect url, + * hence the multi-level url encoding in some of its parts. + */ + public String getWayfinderRedirectUrl() { + String encodedEntityId = URLEncoder.encode(getServiceProviderEntityId(), StandardCharsets.UTF_8); + + // "targetUrl" is the THIRD level redirect - i.e., this where the locally- + // running shibd will bounce the user once it receives the redirect back + // from InCommon/Wayfinder (which is the SECOND redirect in the loop). + // Note that this is a fixed location, the Dataverse page shib.xhtml, + // where, in the underlying bean, the actual magic of translating the + // SAML attributes into a Dataverse user session happens. + // A FOURTH redirect, to the actual destination Dataverse page will be + // added, as a redirectPage parameter for the shib.xhtml page when the + // final redirect URL is put together in LoginPage.java. + String targetUrl = URLEncoder.encode(SystemConfig.getDataverseSiteUrlStatic() + "/shib.xhtml", StandardCharsets.UTF_8); + // "returnUrl" is the SECOND redirect, that Wayfinder is going to issue, + // back to the local shibd instance. This location is also fixed, always + // pointing to /Shibboleth.sso/Login?SAMLDS=1 + String returnUrl = URLEncoder.encode(SystemConfig.getDataverseSiteUrlStatic() + "/Shibboleth.sso/Login?SAMLDS=1", StandardCharsets.UTF_8);; + String wayFinderUrl = INCOMMON_WAYFINDER_URL + "/?entityID=" + encodedEntityId + + "&return=" + returnUrl + + "%2526target%3D" + targetUrl; //"%253FredirectPage%253D%25252Fdataverse.xhtml"; + return wayFinderUrl; + } + + /* + * This is the entityID of the *local* Shibboleth service provider - i.e., + * the registered id of the shibd instance running locally. + * This id is looked up once, in the Singleton that instantiates all + * Authentication Providers, on startup and cached in the + * ShibAuthenticationProvider instance. + * This entity id is needed when generating WayFinder authentication + * redirects to InCommon. + **/ + private String getServiceProviderEntityId() { + String shibProvId = ShibAuthenticationProvider.PROVIDER_ID; + ShibAuthenticationProvider shibAuthProvider = (ShibAuthenticationProvider)authSvc.getAuthenticationProvider(shibProvId); + String ourServiceProviderEntityId = shibAuthProvider.getServiceProviderEntityId(); + + return ourServiceProviderEntityId; + } + private void mutateRequestForDevRandom(HttpServletRequest request) { Map randomUser = authTestDataService.getRandomUser(); request.setAttribute(ShibUtil.lastNameAttribute, randomUser.get("lastName")); diff --git a/src/main/webapp/loginpage.xhtml b/src/main/webapp/loginpage.xhtml index 6c508d27a3f..09661ddd211 100644 --- a/src/main/webapp/loginpage.xhtml +++ b/src/main/webapp/loginpage.xhtml @@ -129,7 +129,7 @@
- +
From b48a228a374d3bdc91f30795c5c587a4d64e1f4f Mon Sep 17 00:00:00 2001 From: Leonid Andreev Date: Fri, 16 May 2025 14:51:29 -0400 Subject: [PATCH 052/470] removed unused imports #11404 --- .../AuthenticationProvidersRegistrationServiceBean.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvidersRegistrationServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvidersRegistrationServiceBean.java index c7c0880bdf2..39901a7a654 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvidersRegistrationServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvidersRegistrationServiceBean.java @@ -19,7 +19,6 @@ import edu.harvard.iq.dataverse.authorization.providers.oauth2.oidc.OIDCAuthenticationProviderFactory; import edu.harvard.iq.dataverse.authorization.providers.shib.ShibAuthenticationProvider; import edu.harvard.iq.dataverse.authorization.providers.shib.ShibAuthenticationProviderFactory; -import edu.harvard.iq.dataverse.authorization.providers.shib.ShibServiceBean; import edu.harvard.iq.dataverse.settings.JvmSettings; import edu.harvard.iq.dataverse.util.SystemConfig; import edu.harvard.iq.dataverse.validation.PasswordValidatorServiceBean; @@ -42,8 +41,6 @@ import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; From a490c3963ba08efa0714828e2fcb9349d3770787 Mon Sep 17 00:00:00 2001 From: Leonid Andreev Date: Sun, 18 May 2025 22:58:42 -0400 Subject: [PATCH 053/470] checking in the final implementation of the new Shibboleth components #11404 --- .../11404-shibboleth-mdq-wayfinder.md | 34 ++++++++++ .../edu/harvard/iq/dataverse/LoginPage.java | 18 +++++ ...ationProvidersRegistrationServiceBean.java | 44 +++++++++--- .../providers/shib/ShibServiceBean.java | 21 +++--- .../iq/dataverse/settings/FeatureFlags.java | 22 +++++- src/main/webapp/loginpage.xhtml | 68 ++++++++++--------- 6 files changed, 155 insertions(+), 52 deletions(-) create mode 100644 doc/release-notes/11404-shibboleth-mdq-wayfinder.md diff --git a/doc/release-notes/11404-shibboleth-mdq-wayfinder.md b/doc/release-notes/11404-shibboleth-mdq-wayfinder.md new file mode 100644 index 00000000000..661e92e4f59 --- /dev/null +++ b/doc/release-notes/11404-shibboleth-mdq-wayfinder.md @@ -0,0 +1,34 @@ +### For Dataverse instances using Shibboleth + +Since the old-style federation metadata feed was discontinued by InCommon, the Shibboleth login components have been re-implemented to utilize the recommended replacements: the MDQ protocol and the WayFinder service. From now on, this will be the default behavior of the login page for shib. users. Dataverse instances using Shibboleth as members of the InCommon federation will need to modify their shibd configuration and, possibly, their registration with Incommon. See the upgrade instruction for details. + +It is also possible for a Dataverse instance to continue using the old login page mechanism (the most likely use case for this would be if you are using Shibboleth without being part of InCommon, for example, by running shibd with a static list of known metadata providers). In this case, set the feature flag `dataverse.feature.shibboleth-use-discofeed=true` to preserve the legacy workflow as is. + +### For the Upgrade Instruction: + +If your instance is offering institutional Shibboleth logins as part of the InCommon federation, you must make some changes to your service configuration. + +a. Configure your Service Provider (SP) in the InCommon Federation Manager to use WayFinder following [their instructions](https://spaces.at.internet2.edu/display/federation/how-to-configure-service-to-use-wayfinder). + +b. Reconfigure your locally-running `shibd` service to use WayFinder and the new MDQ metadata retrieval protocol. +Download and place the new [production signing key](https://spaces.at.internet2.edu/display/MDQ/production-mdq-signing-key) in `/etc/shibboleth` and name it `inc-md-cert-mdq.pem`. +Change the `SSO` and `MetadataProvider` sections of the `/etc/shibboleth/shibboleth2.xml` configuration file as follows: + +``` + + SAML2 SAML1 + +``` +and +``` + + + + +``` +See [How to configure a Shibboleth service provider (SP) to use MDQ](https://spaces.at.internet2.edu/display/MDQ/how-to-configure-shib-sp-to-use-mdq) for more information. + + +If your Dataverse instance is using Shibboleth without being a member of the InCommon federation, you can preserve your working configuration as is and configure Dataverse to continue using the old-style login workflow by setting the feature flag `dataverse.feature.shibboleth-use-discofeed=true`. + diff --git a/src/main/java/edu/harvard/iq/dataverse/LoginPage.java b/src/main/java/edu/harvard/iq/dataverse/LoginPage.java index 0a6ba3e6210..14b7ca3876c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/LoginPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/LoginPage.java @@ -11,6 +11,7 @@ import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUserServiceBean; import edu.harvard.iq.dataverse.authorization.providers.shib.ShibServiceBean; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; +import edu.harvard.iq.dataverse.settings.FeatureFlags; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.JsfHelper; @@ -259,6 +260,14 @@ public void setRedirectPage(String redirectPage) { this.redirectPage = redirectPage; } + /* + * Starting v6.7 the default Shibboleth login mechanism is to use the new + * Wayfinder service from InCommon. We no longer use the javascript from the + * idp package to generate the list of participating institutions and then + * generate the redirect url to the auth. service they choose. Under the new + * model the user is redirected to InCommon and the workflow of picking + * their institutional auth. service provider will be handled there. + */ public String getShibWayfinderRedirect() { String wayFinderUrl = shibService.getWayfinderRedirectUrl(); logger.fine("wayfinder url provided by the shib service: " + wayFinderUrl); @@ -270,6 +279,15 @@ public String getShibWayfinderRedirect() { logger.fine("final redirect url: " + finalRedirectUrl); return finalRedirectUrl; } + + /* + * An instance can still choose to continue using the old, DiscoFeed-based + * workflow, if that is preferable for whatever reason. + */ + public boolean isShibbolethUseDiscoFeed() { + return FeatureFlags.SHIBBOLETH_USE_DISCOFEED.enabled(); + } + public AuthenticationProvider getAuthProvider() { return authProvider; diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvidersRegistrationServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvidersRegistrationServiceBean.java index 39901a7a654..ae95ede364f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvidersRegistrationServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvidersRegistrationServiceBean.java @@ -19,7 +19,9 @@ import edu.harvard.iq.dataverse.authorization.providers.oauth2.oidc.OIDCAuthenticationProviderFactory; import edu.harvard.iq.dataverse.authorization.providers.shib.ShibAuthenticationProvider; import edu.harvard.iq.dataverse.authorization.providers.shib.ShibAuthenticationProviderFactory; +import edu.harvard.iq.dataverse.settings.FeatureFlags; import edu.harvard.iq.dataverse.settings.JvmSettings; +import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.SystemConfig; import edu.harvard.iq.dataverse.validation.PasswordValidatorServiceBean; import java.util.HashMap; @@ -74,6 +76,9 @@ public class AuthenticationProvidersRegistrationServiceBean { @EJB AuthenticationServiceBean authenticationService; + + @EJB + SettingsServiceBean settingsService; /** * The maps below (the objects themselves) are "final", but the @@ -133,18 +138,27 @@ public void startup() { registerProvider( authProvider ); - // For shibboleth specifically, we will call shibd to - // look up and cache its EntityId: + // For production Shibboleth instances that are not using + // the legacy DiscoFeed-based workflow, we need to call + // shibd to look up and cache its entityID, since it will + // be needed in order to issue WayFinder service redirects. - if ("shib".equals(authProvider.getId())) { - String spEntityId = lookupShibbolethEntityId(); - logger.info("Looked up the entityId of the shibboleth service provider (via a call to shibd): " - +spEntityId); - if (spEntityId == null) { - // we'll make this educated guess - it may or may not help us later on: - spEntityId = SystemConfig.getDataverseSiteUrlStatic() + "/sp"; + if ("shib".equals(authProvider.getId()) + && !FeatureFlags.SHIBBOLETH_USE_DISCOFEED.enabled()) { + // ... is this a prod. shibboleth instance? + String shibTypeSetting = settingsService.getValueForKey(SettingsServiceBean.Key.DebugShibAccountType, null); + boolean isProduction = shibTypeSetting == null || shibTypeSetting.equals("PRODUCTION"); + + if (isProduction) { + String spEntityId = lookupShibbolethEntityId(); + logger.info("Looked up the entityId of the shibboleth service provider (via a call to shibd): " + + spEntityId); + if (spEntityId == null) { + // we'll make this educated guess - it may or may not help us later on: + spEntityId = SystemConfig.getDataverseSiteUrlStatic() + "/sp"; + } + ((ShibAuthenticationProvider) authProvider).setServiceProviderEntityId(spEntityId); } - ((ShibAuthenticationProvider)authProvider).setServiceProviderEntityId(spEntityId); } } catch ( AuthenticationProviderFactoryNotFoundException e ) { @@ -338,7 +352,15 @@ public boolean isOrcidEnabled() { private String lookupShibbolethEntityId() { - String urlString = SystemConfig.getDataverseSiteUrlStatic() + "/Shibboleth.sso/Metadata"; + String baseUrl; + if (FeatureFlags.SHIBBOLETH_USE_LOCALHOST.enabled()) { + baseUrl = "http://localhost"; + } else { + baseUrl = SystemConfig.getDataverseSiteUrlStatic(); + } + + String urlString = baseUrl + "/Shibboleth.sso/Metadata"; + URL url = null; try { url = new URL(urlString); diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java index 51cd28614d1..67860c7278e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java @@ -8,6 +8,7 @@ import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUser; import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUserServiceBean; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; +import edu.harvard.iq.dataverse.settings.FeatureFlags; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.SystemConfig; import java.io.IOException; @@ -175,15 +176,15 @@ public BuiltinUser findBuiltInUserByAuthUserIdentifier(String authUserIdentifier } public String getAffiliation(String shibIdp, DevShibAccountType devShibAccountType) { - if (!devShibAccountType.equals(DevShibAccountType.PRODUCTION)) { - return getAffiliationFromDiscoFeed(shibIdp, devShibAccountType); + if (!devShibAccountType.equals(DevShibAccountType.PRODUCTION) || FeatureFlags.SHIBBOLETH_USE_DISCOFEED.enabled()) { + return getAffiliationFromDiscoFeed(shibIdp, devShibAccountType); } return getAffiliationViaMDQ(shibIdp); } public String getAffiliationViaMDQ(String shibIdp) { String entityIdEncoded = URLEncoder.encode(shibIdp, StandardCharsets.UTF_8); - String apiUrl = INCOMMON_MDQ_API_ENTITIES_URL + entityIdEncoded; //"https://mdq.incommon.org/entities/https%3A%2F%2Ffed.huit.harvard.edu%2Fidp%2Fshibboleth" + String apiUrl = INCOMMON_MDQ_API_ENTITIES_URL + entityIdEncoded; logger.fine("cooked Incommon MDQ url: " + apiUrl); @@ -258,7 +259,7 @@ public String getAffiliationViaMDQ(String shibIdp) { logger.fine("closing xml reader"); xmlr.close(); } catch (XMLStreamException xsex) { - // do we care? + // we don't care at this point } } } @@ -269,9 +270,9 @@ public String getAffiliationViaMDQ(String shibIdp) { /* * This is the old-style method of obtaining the affiliation - by calling - * the DiscoFeed, provided by the locally-running shibd instance, finding - * the provider in the full json-formatted list and selecting its "display - * name". It is kept in the code for now, under the assumption that somebody + * DiscoFeed, provided either by the locally-running "real" shibd instance, + * or a static list in the same json format when in dev./testing mode. + * It is kept in the code for now, under the assumption that somebody * may still have reasons to keep using the DiscoFeed-based model. **/ public String getAffiliationFromDiscoFeed(String shibIdp, DevShibAccountType devShibAccountType) { @@ -279,7 +280,11 @@ public String getAffiliationFromDiscoFeed(String shibIdp, DevShibAccountType dev String discoFeedJson = emptyJsonArray.toString(); String discoFeedUrl; if (devShibAccountType.equals(DevShibAccountType.PRODUCTION)) { - discoFeedUrl = systemConfig.getDataverseSiteUrl() + "/Shibboleth.sso/DiscoFeed"; + if (FeatureFlags.SHIBBOLETH_USE_LOCALHOST.enabled()) { + discoFeedUrl = "http://localhost/Shibboleth.sso/DiscoFeed"; + } else { + discoFeedUrl = systemConfig.getDataverseSiteUrl() + "/Shibboleth.sso/DiscoFeed"; + } } else { String devUrl = "http://localhost:8080/resources/dev/sample-shib-identities.json"; discoFeedUrl = devUrl; diff --git a/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java b/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java index f3b9a1bf180..e9c4d6a4866 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java @@ -151,7 +151,27 @@ public enum FeatureFlags { * @since Dataverse 6.5 */ VERSION_NOTE("enable-version-note"), - + /** + * This flag allows an instance to continue using the old-style Shibboleth + * implementation that relies on DiscoFeed. The default behavior, starting + * v6.7 will be to use the new implementation that utilizes the MDQ protocol + * and Wayfinder service. + * @apiNote Raise flag by setting + * "dataverse.feature.shibboleth-use-discofeed" + * @since Dataverse 6.7 + */ + SHIBBOLETH_USE_DISCOFEED("shibboleth-use-discofeed"), + /** + * In both the new and old Shibboleth implementations Dataverse needs to + * make network calls to the local shibd service running on the same server. + * The default behavior is use the address configured via the siteUrl setting. + * There are however situations (firewalls, etc.) where localhost would + * be preferable. + * @apiNote Raise flag by setting + * "dataverse.feature.shibboleth-use-localhost" + * @since Dataverse 6.7 + */ + SHIBBOLETH_USE_LOCALHOST("shibboleth-use-localhost"), ; final String flag; diff --git a/src/main/webapp/loginpage.xhtml b/src/main/webapp/loginpage.xhtml index 09661ddd211..acdd27b8ac7 100644 --- a/src/main/webapp/loginpage.xhtml +++ b/src/main/webapp/loginpage.xhtml @@ -127,46 +127,50 @@ - -
+ + + +
+ +
+ + + + + +
- - - -
-
From fbc118710d212c71e498f0e1433b7f81a68ca297 Mon Sep 17 00:00:00 2001 From: Leonid Andreev Date: Sun, 18 May 2025 23:14:24 -0400 Subject: [PATCH 054/470] checking in the new sample shibboleth2.xml file modified to match the new mdq and wayfinder configuration #11404 --- .../installation/files/etc/shibboleth/shibboleth2.xml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/doc/sphinx-guides/source/_static/installation/files/etc/shibboleth/shibboleth2.xml b/doc/sphinx-guides/source/_static/installation/files/etc/shibboleth/shibboleth2.xml index 3960d003ad2..6df460f3eed 100644 --- a/doc/sphinx-guides/source/_static/installation/files/etc/shibboleth/shibboleth2.xml +++ b/doc/sphinx-guides/source/_static/installation/files/etc/shibboleth/shibboleth2.xml @@ -23,6 +23,12 @@ https://wiki.shibboleth.net/confluence/display/SHIB2/NativeSPConfiguration SAML2 SAML1 + + + + @@ -58,7 +64,9 @@ https://wiki.shibboleth.net/confluence/display/SHIB2/NativeSPConfiguration From 4ecb0903a7e795bd996102cf2efbc956d3b3a7ac Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Tue, 20 May 2025 14:46:21 -0400 Subject: [PATCH 058/470] tweaks to docs #11404 --- doc/release-notes/11404-shibboleth-mdq-wayfinder.md | 5 +++++ doc/sphinx-guides/source/installation/config.rst | 6 ++++++ doc/sphinx-guides/source/installation/shibboleth.rst | 8 ++++---- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/doc/release-notes/11404-shibboleth-mdq-wayfinder.md b/doc/release-notes/11404-shibboleth-mdq-wayfinder.md index 661e92e4f59..9ef44202415 100644 --- a/doc/release-notes/11404-shibboleth-mdq-wayfinder.md +++ b/doc/release-notes/11404-shibboleth-mdq-wayfinder.md @@ -4,6 +4,11 @@ Since the old-style federation metadata feed was discontinued by InCommon, the S It is also possible for a Dataverse instance to continue using the old login page mechanism (the most likely use case for this would be if you are using Shibboleth without being part of InCommon, for example, by running shibd with a static list of known metadata providers). In this case, set the feature flag `dataverse.feature.shibboleth-use-discofeed=true` to preserve the legacy workflow as is. +### New Settings + +- dataverse.feature.shibboleth-use-discofeed +- dataverse.feature.shibboleth-use-localhost + ### For the Upgrade Instruction: If your instance is offering institutional Shibboleth logins as part of the InCommon federation, you must make some changes to your service configuration. diff --git a/doc/sphinx-guides/source/installation/config.rst b/doc/sphinx-guides/source/installation/config.rst index c1790302de9..6a638f8186d 100644 --- a/doc/sphinx-guides/source/installation/config.rst +++ b/doc/sphinx-guides/source/installation/config.rst @@ -3524,6 +3524,12 @@ please find all known feature flags below. Any of these flags can be activated u * - enable-version-note - Turns on the ability to add/view/edit/delete per-dataset-version notes intended to provide :ref:`provenance` information about why the dataset/version was created. - ``Off`` + * - shibboleth-use-discofeed + - This flag allows an instance to continue using the old-style Shibboleth implementation that relies on DiscoFeed. The default behavior, starting v6.7 will be to use the new implementation that utilizes the MDQ protocol and Wayfinder service. + - ``Off`` + * - shibboleth-use-localhost + - In both the new and old Shibboleth implementations Dataverse needs to make network calls to the local shibd service running on the same server. The default behavior is use the address configured via the siteUrl setting. There are however situations (firewalls, etc.) where localhost would be preferable. + - ``Off`` **Note:** Feature flags can be set via any `supported MicroProfile Config API source`_, e.g. the environment variable ``DATAVERSE_FEATURE_XXX`` (e.g. ``DATAVERSE_FEATURE_API_SESSION_AUTH=1``). These environment variables can be set in your shell before starting Payara. If you are using :doc:`Docker for development `, you can set them in the `docker compose `_ file. diff --git a/doc/sphinx-guides/source/installation/shibboleth.rst b/doc/sphinx-guides/source/installation/shibboleth.rst index 7333f2c8959..0a241197694 100644 --- a/doc/sphinx-guides/source/installation/shibboleth.rst +++ b/doc/sphinx-guides/source/installation/shibboleth.rst @@ -159,9 +159,9 @@ Rather than or in addition to specifying individual Identity Providers (see :ref For example, in the United States, you would register your Dataverse installation with `InCommon `_. For a list of federations around the world, see `REFEDS (the Research and Education FEDerations group) `_. The details of how to register with an identity federation are out of scope for this document. -If you are planning to use InCommon, please note that ``shibd`` needs to be configured to use the new MDQ protocol and WayFinder service. The sample ``shibboleth2.xml`` provided already contains commented-out sections pre-configured to work with this new InCommon framework. Please see https://spaces.at.internet2.edu/display/MDQ/how-to-configure-shib-sp-to-use-mdq and https://spaces.at.internet2.edu/display/federation/how-to-configure-service-to-use-wayfinder for more information. +If you are planning to use InCommon, please note that ``shibd`` needs to be configured to use the new MDQ protocol and WayFinder `service `_ `announced `_ `by `_ InCommon. The sample ``shibboleth2.xml`` provided already contains commented-out sections pre-configured to work with this new InCommon framework. Please see https://spaces.at.internet2.edu/display/MDQ/how-to-configure-shib-sp-to-use-mdq and https://spaces.at.internet2.edu/display/federation/how-to-configure-service-to-use-wayfinder for more information. -If your instance is not a part of InCommon and your ``shibd`` instance will be using provider metadata in the old ``type="XML"`` format, you will need to set the feature flag ``dataverse.feature.shibboleth-use-discofeed=true``. +If your instance is not a part of InCommon and your ``shibd`` instance will be using provider metadata in the old ``type="XML"`` format, you will need to set the feature flag ``dataverse.feature.shibboleth-use-discofeed=true`` (see :ref:`feature-flags`). For a successful login to Dataverse, certain :ref:`shibboleth-attributes` must be released by the Identity Provider (IdP). Otherwise, in the federation context, users will have the frustrating experience of selecting their IdP in the list but then getting an error like ``Problem with Identity Provider – The SAML assertion for "eppn" was null``. We definitely want to prevent this! There's even some guidance about this problem in the User Guide under the heading :ref:`fix-shib-login` that links back here. @@ -271,14 +271,14 @@ Substitute your hostname and verify that you are seeing your service provider me - https://dataverse.example.edu/Shibboleth.sso/Metadata -If your instance is using Discofeed: Verify DiscoFeed URL +If Your Instance is Using Discofeed: Verify DiscoFeed URL --------------------------------------------------------- As another sanity check, substitute your hostname and make sure you see well-formed JSON: - https://dataverse.example.edu/Shibboleth.sso/DiscoFeed -(skip this step if you'll be using Shibboleth as a registered member of InCommon federation) +(Skip this step if you'll be using Shibboleth as a registered member of InCommon federation. This is only relevant if you are setting ``dataverse.feature.shibboleth-use-discofeed=true`` as described under :ref:`identity-federation`.) The JSON in ``DiscoFeed`` comes from the list of IdPs you configured in the ``MetadataProvider`` section of ``shibboleth2.xml`` and will form a dropdown list on the Login Page. From daf1b1d8886b1b6bdf5b5e708d3a0db5520eab99 Mon Sep 17 00:00:00 2001 From: Leonid Andreev Date: Tue, 27 May 2025 13:14:56 -0400 Subject: [PATCH 059/470] Refactored the new WayFinder/MDQ implementation the other way around, i.e. making it optional, while keeping the DiscoFeed-based workflow the default. (Should've been implemented like this all along, the initial take was a result of misunderstanding). #11404 --- .../edu/harvard/iq/dataverse/LoginPage.java | 8 +++--- ...ationProvidersRegistrationServiceBean.java | 2 +- .../providers/shib/ShibServiceBean.java | 2 +- .../iq/dataverse/settings/FeatureFlags.java | 26 +++++++++++-------- src/main/webapp/loginpage.xhtml | 10 +++---- 5 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/LoginPage.java b/src/main/java/edu/harvard/iq/dataverse/LoginPage.java index 14b7ca3876c..ac1dedad6fb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/LoginPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/LoginPage.java @@ -281,11 +281,11 @@ public String getShibWayfinderRedirect() { } /* - * An instance can still choose to continue using the old, DiscoFeed-based - * workflow, if that is preferable for whatever reason. + * An instance that uses Shibboleth as part of InCommon can switch to using + * the new login workflow that relies on WayFinder and MDQ. */ - public boolean isShibbolethUseDiscoFeed() { - return FeatureFlags.SHIBBOLETH_USE_DISCOFEED.enabled(); + public boolean isShibbolethUseWayFinder() { + return FeatureFlags.SHIBBOLETH_USE_WAYFINDER.enabled(); } diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvidersRegistrationServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvidersRegistrationServiceBean.java index ae95ede364f..99586b59d07 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvidersRegistrationServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvidersRegistrationServiceBean.java @@ -144,7 +144,7 @@ public void startup() { // be needed in order to issue WayFinder service redirects. if ("shib".equals(authProvider.getId()) - && !FeatureFlags.SHIBBOLETH_USE_DISCOFEED.enabled()) { + && FeatureFlags.SHIBBOLETH_USE_WAYFINDER.enabled()) { // ... is this a prod. shibboleth instance? String shibTypeSetting = settingsService.getValueForKey(SettingsServiceBean.Key.DebugShibAccountType, null); boolean isProduction = shibTypeSetting == null || shibTypeSetting.equals("PRODUCTION"); diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java index 67860c7278e..789165e1205 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/shib/ShibServiceBean.java @@ -176,7 +176,7 @@ public BuiltinUser findBuiltInUserByAuthUserIdentifier(String authUserIdentifier } public String getAffiliation(String shibIdp, DevShibAccountType devShibAccountType) { - if (!devShibAccountType.equals(DevShibAccountType.PRODUCTION) || FeatureFlags.SHIBBOLETH_USE_DISCOFEED.enabled()) { + if (!(devShibAccountType.equals(DevShibAccountType.PRODUCTION) && FeatureFlags.SHIBBOLETH_USE_WAYFINDER.enabled())) { return getAffiliationFromDiscoFeed(shibIdp, devShibAccountType); } return getAffiliationViaMDQ(shibIdp); diff --git a/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java b/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java index e9c4d6a4866..17f3d4d18e2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java @@ -152,21 +152,25 @@ public enum FeatureFlags { */ VERSION_NOTE("enable-version-note"), /** - * This flag allows an instance to continue using the old-style Shibboleth - * implementation that relies on DiscoFeed. The default behavior, starting - * v6.7 will be to use the new implementation that utilizes the MDQ protocol - * and Wayfinder service. + * This flag allows an instance to use the new InCommon Shibboleth + * implementation that relies on MDQ protocol for the federation metadata + * and the WayFinder service for the login page. As opposed to the default + * behavior, that relies on the "XML"-type metadata and DiscoFeed + * respectively. The majority of the Shibboleth-using instances that do not + * rely on InCommon do not need this feature and will continue using the old + * implementation. * @apiNote Raise flag by setting - * "dataverse.feature.shibboleth-use-discofeed" + * "dataverse.feature.shibboleth-use-wayfinder" * @since Dataverse 6.7 */ - SHIBBOLETH_USE_DISCOFEED("shibboleth-use-discofeed"), + SHIBBOLETH_USE_WAYFINDER("shibboleth-use-wayfinder"), /** - * In both the new and old Shibboleth implementations Dataverse needs to - * make network calls to the local shibd service running on the same server. - * The default behavior is use the address configured via the siteUrl setting. - * There are however situations (firewalls, etc.) where localhost would - * be preferable. + * Whether the Dataverse instance uses the "XML"-type metadata and the idp + * javascript-based login page, or MDQ and WayFinder in the new implementation, + * it needs to make network calls to the locally-running shibd service. + * The default behavior is to use the address configured via the siteUrl + * setting. There are however situations (firewalls, etc.) where localhost + * would be preferable. * @apiNote Raise flag by setting * "dataverse.feature.shibboleth-use-localhost" * @since Dataverse 6.7 diff --git a/src/main/webapp/loginpage.xhtml b/src/main/webapp/loginpage.xhtml index acdd27b8ac7..83dcb354475 100644 --- a/src/main/webapp/loginpage.xhtml +++ b/src/main/webapp/loginpage.xhtml @@ -128,15 +128,15 @@ #{bundle['auth.providers.title.shib']} - - -
+ + +
- -
+ +
- - + + - - + + - - + + - + @@ -114,13 +138,13 @@ - + - - + + @@ -141,20 +165,20 @@

#{DatasetPage.datasetVersionUI.title.value}

- - - - + + + + - + - + - - + +
@@ -163,10 +187,10 @@
- + - + @@ -184,70 +208,70 @@