Skip to content
Snippets Groups Projects
Commit a3568029 authored by Jesper Zedlitz's avatar Jesper Zedlitz
Browse files

Auswertung der EDP Kennzahlen nicht-proprietär und maschinenlesbar

parent c618a050
No related branches found
No related tags found
No related merge requests found
Showing
with 2573 additions and 14 deletions
......@@ -16,6 +16,7 @@ import org.slf4j.LoggerFactory;
import java.io.*;
import java.util.*;
import java.util.zip.GZIPInputStream;
/**
* Berechnet zu einem DCAT-AP.de konformen Katalog diverse Statistiken.
......@@ -41,6 +42,7 @@ public class DcatStatistics {
private Set<String> validPoliticalGeocodingLevels;
private Set<String> validContributors;
private Set<String> validAccrualFrequencies;
private Set<String> machineReadableFormat;
static Collection<Resource> listDistributionsForDataset(Resource dataset) {
final Set<Resource> result = new HashSet<>();
......@@ -95,6 +97,47 @@ public class DcatStatistics {
return result;
}
/**
* Reads a RDF document contaning standard vocabulary, such as the European file formats.
*/
private void addExternalVocabulary(Model model, String type, String resourceName) throws IOException {
final InputStream is;
if (resourceName.endsWith(".gz")) {
is = new GZIPInputStream(getClass().getResourceAsStream(resourceName));
} else {
is = getClass().getResourceAsStream(resourceName);
}
model.read(is, null, type);
}
/**
* Read a vocabulary file from the European Data Portal and extract information about distribution formats.
*/
private Map<String, Boolean> readFormatInformation( String resourceName, Property property) {
final Map<String, Boolean> result = new HashMap<>();
final Model model = ModelFactory.createDefaultModel();
model.read(getClass().getResourceAsStream(resourceName), null, "RDF/XML");
final ResIterator it = model.listSubjects();
while (it.hasNext()) {
final Resource resource = it.next();
final Statement statement = resource.getProperty(property);
if (statement != null) {
boolean value = statement.getObject().asLiteral().getBoolean();
String format = StringUtils.substringAfterLast(resource.getURI(), "/");
result.put(format, value);
}
}
return result;
}
Map<String, Boolean> machineReadableFormats;
Map<String, Boolean> nonProprietaryFormats;
private void work() throws IOException {
validFileTypes = readVocabulary("http://publications.europa.eu/resource/authority/file-type");
......@@ -106,6 +149,10 @@ public class DcatStatistics {
validContributors = readVocabulary("https://www.dcat-ap.de/def/contributors/20190531.rdf");
final Model model = ModelFactory.createDefaultModel();
machineReadableFormats = readFormatInformation("/edp-vocabularies/edp-machine-readable-format.rdf", EDP.isMachineReadable);
nonProprietaryFormats = readFormatInformation("/edp-vocabularies/edp-non-proprietary-format.rdf", EDP.isNonProprietary);
final File dir = new File("target/");
final File[] files = dir.listFiles((file, name) -> name.endsWith(".ttl"));
if (files != null) {
......@@ -158,8 +205,10 @@ public class DcatStatistics {
System.out.println("## Zugänglichkeit");
System.out.println("- DownloadURL\t" + global.distributionProperties.get(DCAT.downloadURL) / numberOfDistributions);
System.out.println("## Interoperabilität");
System.out.println("- Format\t" + global.distributionProperties.get(DCTerms.format) / numberOfDistributions);
System.out.println("- Media Type\t" + global.distributionProperties.get(DCAT.mediaType) / numberOfDistributions);
System.out.println("- Format verfügbar\t" + global.distributionProperties.get(DCTerms.format) / numberOfDistributions);
System.out.println("- Media Type verfügbar\t" + global.distributionProperties.get(DCAT.mediaType) / numberOfDistributions);
System.out.println("- Nicht-proprietär\t" + global.datasetWithAtLeastOneNonProprietaryFormat / numberOfDatasets);
System.out.println("- Maschinenlesbarkeit\t" + global.datasetWithAtLeastOneMachineReadableDistribution / numberOfDatasets);
System.out.println("## Wiederverwendbarkeit");
System.out.println("- Lizenzangaben\t" + global.datasetProperties.get(DCTerms.license) / numberOfDatasets);
System.out.println("- Zugangsbeschränksangaben\t" + global.datasetProperties.get(DCTerms.accessRights) / numberOfDatasets);
......@@ -304,11 +353,17 @@ public class DcatStatistics {
final Collection<Resource> distributions = listDistributionsForDataset(dataset);
boolean hasMachineReadableDistribution = false;
boolean hasNonProprietaryFormat = false;
for (final Resource distribution : distributions) {
statistics.numberOfDistributions++;
global.numberOfDistributions++;
workOnFormat(distribution, statistics, contributor);
final String format = workOnFormat(distribution, statistics, contributor);
hasMachineReadableDistribution |= machineReadableFormats.getOrDefault(format,false);
hasNonProprietaryFormat |= nonProprietaryFormats.getOrDefault(format,false);
workOnDistributionLicense(distribution, statistics);
checkDistributionProperty(statistics, distribution, DCAT.accessURL);
checkDistributionProperty(statistics, distribution, DCAT.downloadURL);
......@@ -320,6 +375,16 @@ public class DcatStatistics {
checkDistributionProperty(statistics, distribution, DCAT.byteSize);
checkDistributionProperty(statistics, distribution, SPDX.checksum);
}
if (hasMachineReadableDistribution) {
statistics.datasetWithAtLeastOneMachineReadableDistribution++;
global.datasetWithAtLeastOneMachineReadableDistribution++;
}
if (hasNonProprietaryFormat) {
statistics.datasetWithAtLeastOneNonProprietaryFormat++;
global.datasetWithAtLeastOneNonProprietaryFormat++;
}
}
private void workOnDistributionLicense(Resource distribution, Statistics statistics) {
......@@ -361,9 +426,9 @@ public class DcatStatistics {
}
private void workOnFormat(Resource distribution, Statistics statistics, String contributor) {
Statement formatStatement = distribution.getProperty(DCTerms.format);
RDFNode format = formatStatement == null ? null : formatStatement.getObject();
private String workOnFormat(Resource distribution, Statistics statistics, String contributor) {
final Statement formatStatement = distribution.getProperty(DCTerms.format);
final RDFNode format = formatStatement == null ? null : formatStatement.getObject();
String formatString = StringUtils.EMPTY;
......@@ -384,6 +449,8 @@ public class DcatStatistics {
statistics.formats.add(formatString);
global.formats.add(formatString);
return formatString;
}
private void workOnIdentifier(Resource dataset, Statistics statistics) {
......@@ -455,6 +522,8 @@ public class DcatStatistics {
int identifierIsURI = 0;
int distributionWithoutLicense = 0;
int numberOfDatasets = 0;
int datasetWithAtLeastOneNonProprietaryFormat = 0;
int datasetWithAtLeastOneMachineReadableDistribution = 0;
void incrementDatasetInformation(Property property, boolean isLiteral, boolean isInvalid) {
datasetProperties.put(property, datasetProperties.getOrDefault(property, 0) + 1);
......@@ -475,6 +544,8 @@ public class DcatStatistics {
void writeHeader(PrintStream out) {
out.print("contributor\t" +
"Number of Datasets\t" +
"Datasets with machine readable distribution\t" +
"Datasets with non-propietary format\t" +
"Datasets without contributor (bad)\t" +
"Datasets without identifier (bad)\t" +
"Datasets with URI identifier (good)\t");
......@@ -520,6 +591,10 @@ public class DcatStatistics {
out.print('\t');
out.print(numberOfDatasets);
out.print('\t');
out.print(datasetWithAtLeastOneMachineReadableDistribution);
out.print('\t');
out.print(datasetWithAtLeastOneNonProprietaryFormat);
out.print('\t');
out.print(datasetWithoutContributor);
out.print('\t');
out.print(noIdentifier);
......
package de.landsh.opendata;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.Property;
import org.apache.jena.rdf.model.Resource;
public class EDP {
public static final String NS = "https://europeandataportal.eu/voc#";
public static final Resource NAMESPACE;
public static final Property isMachineReadable;
public static final Property isNonProprietary;
private static final Model m_model = ModelFactory.createDefaultModel();
static {
NAMESPACE = m_model.createResource(NS);
isMachineReadable = m_model.createProperty(NS, "isMachineReadable");
isNonProprietary = m_model.createProperty(NS, "isNonProprietary");
}
private EDP() {
}
public static String getURI() {
return NS;
}
}
package de.landsh.opendata;
import me.tongfei.progressbar.ProgressBar;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.riot.RDFLanguages;
import org.apache.jena.riot.RDFParser;
import org.apache.jena.riot.RiotException;
import org.apache.jena.riot.system.ErrorHandlerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.nio.file.Files;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Einige Länderportal senden so dermaßen kaputte Datensätze an GovData, dass der RDF-Parser den ganzen Katalog nicht
* verarbeiten kann. Dieses Programm filtert solch defekte Datensätze heraus.
*/
public class FixBrokenDcatFiles {
public static final Logger log = LoggerFactory.getLogger(FixBrokenDcatFiles.class);
public static void main(String[] args) throws IOException {
final Set<File> filesWithErrors = new HashSet<>();
final File dir = new File("target/");
final File[] files = dir.listFiles((file, name) -> name.endsWith(".ttl"));
if (files != null) {
for (File file : ProgressBar.wrap(Arrays.asList(files), "Fixing broker RDF docments")) {
if (!isValidRdf(file)) {
filesWithErrors.add(file);
}
}
}
log.info("{} files contain errors.", filesWithErrors.size());
for (File file : filesWithErrors) {
log.info("Fixing {}...", file);
fixFile(file);
}
}
static void fixFile(File file) throws IOException {
int lineWithError = findFirstErrorLine(file);
if (lineWithError > 0) {
final List<String> lines = Files.readAllLines(file.toPath());
while (!isValidRdf(String.join("\n", lines))) {
final int totalNumberOfLines = lines.size();
// Wir suchen rückwärts, bis wir gültiges RDF haben.
int endOfValidRdf = lineWithError - 1;
while (endOfValidRdf > 0 && !isValidRdf(String.join("\n", lines.subList(0, endOfValidRdf)) + "\n<http://example.org/dummy> a <http://example.org/Dummy> .\n")) {
endOfValidRdf--;
}
// Das vermutliche Ende der defekten Resource finden.
int endOfDefect = lineWithError + 1;
while (endOfDefect < totalNumberOfLines && !lines.get(endOfDefect).endsWith(" .")) {
endOfDefect++;
}
lines.subList(endOfValidRdf, endOfDefect + 1).clear();
}
final PrintStream out = new PrintStream(new FileOutputStream(file));
for (String line : lines) {
out.println(line);
}
out.close();
}
}
static boolean isValidRdf(String text) {
final Model model = ModelFactory.createDefaultModel();
try {
RDFParser.create()
.source(new StringReader(text))
.lang(RDFLanguages.TTL)
.base("http://open/data")
.errorHandler(ErrorHandlerFactory.errorHandlerSimple())
.parse(model);
return true;
} catch (RiotException e) {
return false;
}
}
/**
* Check if the specified file contains a readable RDF document.
*/
static boolean isValidRdf(File file) throws FileNotFoundException {
final Model model = ModelFactory.createDefaultModel();
try {
RDFParser.create()
.source(new FileInputStream(file))
.lang(RDFLanguages.TTL)
.base("http://open/data")
.errorHandler(ErrorHandlerFactory.errorHandlerSimple())
.parse(model);
return true;
} catch (RiotException e) {
return false;
}
}
static int findFirstErrorLine(File file) throws FileNotFoundException {
// Find the line with the first error
final Model model = ModelFactory.createDefaultModel();
try {
RDFParser.create()
.source(new FileInputStream(file))
.lang(RDFLanguages.TTL)
.base("http://open/data")
.errorHandler(ErrorHandlerFactory.errorHandlerSimple())
.parse(model);
return -1;
} catch (RiotException e) {
return NumberUtils.toInt(StringUtils.substringBetween(e.getMessage(), "line: ", ", col"));
}
}
}
# EDP Vocabularies
The European Data Portals applies controlled vocabularies and ontology. This includes vocabularies defined within the [DCAT-AP](https://joinup.ec.europa.eu/solution/dcat-application-profile-data-portals-europe) specifications, additional extensions and custom ones.
## IANA
Controlled media types from the Internet Assigned Numbers Authority (IANA) are used without modifications and are retrieved from here: https://www.iana.org/assignments/media-types/media-types.xhtml
## EU Vocabularies
Official controlled vocabularies published by the Publications Office of the European Union are used. They are retrieved without modifications from here: https://op.europa.eu/en/web/eu-vocabularies/authority-tables
## Extensions and Custom Vocabularies
Additional extensions and custom vocabularies used for several applications:
- edp-licences-skos: Extends the vocabulary of licences.
- edp-machine-readable-format: Extends the file-type vocabulary with machine-readable information.
- edp-non-proprietary-format: Extends the file-type vocabulary with non-proprietary information.
- edp-dqv-vocabulary: Defines the vocabulary for describing and storing the measurements of the MQA. It is based on [W3C DQV](https://www.w3.org/TR/vocab-dqv/).
- edp-scoring-skos: Defines the different scoring levels for the MQA.
@prefix dqv: <http://www.w3.org/ns/dqv#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix dcat: <http://www.w3.org/ns/dcat#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix dc: <http://purl.org/dc/terms/> .
@prefix pv: <https://piveau.eu/ns/voc#> .
# Dimensions
pv:accessibility
a dqv:Dimension ;
skos:prefLabel "Accessibility"@en ;
skos:definition "Once the user finds the required data, she/he needs to know how can they be accessed, possibly including authentication and authorisation."@en .
pv:contextuality
a dqv:Dimension ;
skos:prefLabel "Contextuality"@en ;
skos:definition "Properties that provide more context for the user."@en .
pv:findability
a dqv:Dimension ;
skos:prefLabel "Findability"@en ;
skos:definition "Metadata and data should be easy to find for both humans and computers. Machine-readable metadata are essential for automatic discovery of datasets and services."@en .
pv:interoperability
a dqv:Dimension ;
skos:prefLabel "Interoperability"@en ;
skos:definition "Data usually needs to be integrated with other data. In addition, data needs to interoperate with applications or workflows for analysis, storage, and processing."@en .
pv:reusability
a dqv:Dimension ;
skos:prefLabel "Reusability"@en ;
skos:definition "Metadata and data should be well-described so that they can be replicated and/or combined in different settings."@en .
# Five star
pv:OpenData5Star
a skos:ConceptScheme;
skos:prefLabel "Open Data 5 Star"@en ;
skos:definition "Five star rating based on https://5stardata.info"@en ;
dqv:inDimension pv:interoperability .
pv:zeroStars
a skos:Concept;
skos:inScheme pv:OpenData5Star ;
skos:prefLabel "Zero stars"@en ;
skos:definition "Dataset available on the web."@en .
pv:oneStar
a skos:Concept;
skos:inScheme pv:OpenData5Star ;
skos:prefLabel "One star"@en ;
skos:definition "Dataset available on the web with open licence."@en .
pv:twoStars
a skos:Concept;
skos:inScheme pv:OpenData5Star ;
skos:prefLabel "Two stars"@en ;
skos:definition "Dataset available on the web with open licence and structured, machine-readable format."@en .
pv:threeStars
a skos:Concept;
skos:inScheme pv:OpenData5Star ;
skos:prefLabel "Three stars"@en ;
skos:definition "Dataset available on the web with open licence and structured, machine-readable, non proprietary format."@en .
pv:fourStars
a skos:Concept;
skos:inScheme pv:OpenData5Star ;
skos:prefLabel "Four stars"@en ;
skos:definition "Dataset available on the web with open licence and structured, machine-readable, non proprietary format. It uses URIs to denote things."@en .
pv:fiveStars
a skos:Concept;
skos:inScheme pv:OpenData5Star ;
skos:prefLabel "Five stars"@en ;
skos:definition "Dataset available on the web with open licence and structured, machine-readable, non proprietary format. It uses URIs to denote things and links to other resources for context."@en .
# Findability
pv:keywordAvailability
a dqv:Metric ;
skos:definition "It is checked whether at least one dcat:keyword is specified in a dataset."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:findability .
pv:categoryAvailability
a dqv:Metric ;
skos:definition "It is checked whether at least one dcat:theme is specified in a dataset."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:findability .
pv:spatialAvailability
a dqv:Metric ;
skos:definition "It is checked whether at least one dct:spatial is specified in a dataset."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:findability .
pv:temporalAvailability
a dqv:Metric ;
skos:definition "It is checked whether at least one dct:temporal is specified in a dataset."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:findability .
# Accessibility
pv:accessUrlStatusCode
a dqv:Metric ;
skos:definition "A distribution's dcat:accessURL is checked for accessibility via HTTP HEAD request. The response contains a numeric status code."@en ;
dqv:expectedDataType xsd:integer ;
dqv:inDimension pv:accessibility .
pv:downloadUrlAvailability
a dqv:Metric ;
skos:definition "It is checked whether at least one dcat:downloadUrl is specified in a distribution."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:accessibility .
pv:downloadUrlStatusCode
a dqv:Metric ;
skos:definition "A distribution's dcat:downloadURL is checked for accessibility via HTTP HEAD request. The response contains a numeric status code."@en ;
dqv:expectedDataType xsd:integer ;
dqv:inDimension pv:accessibility .
# Interoperability
pv:formatAvailability
a dqv:Metric ;
skos:definition "It is checked whether dct:format is specified in a distribution."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:interoperability .
pv:mediaTypeAvailability
a dqv:Metric ;
skos:definition "It is checked whether dcat:mediaType is specified in a distribution."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:interoperability .
pv:formatMediaTypeVocabularyAlignment
a dqv:Metric ;
skos:definition "Checks if both a distribution&apos;s dct:format and dcat:mediaType are aligned to the controlled vocabulary specified by DCAT-AP."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:interoperability .
pv:formatMediaTypeNonProprietary
a dqv:Metric ;
skos:definition "Checks if at least one of a distribution&apos;s dct:format and dcat:mediaType is non-proprietary. If neither is set it is assumed the distribution uses a proprietary format/media type."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:interoperability .
pv:formatMediaTypeMachineInterpretable
a dqv:Metric ;
skos:definition "Checks if at least one of a distribution's dct:format and dcat:mediaType is machine-interpretable. If neither is set it is assumed the distribution uses a non-machine-interpretable format/media type."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:interoperability .
pv:dcatApCompliance
a dqv:Metric ;
skos:definition "A dataset is validated for conformity against the DCAT-AP specification using SHACL rules."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:interoperability .
pv:formatMatch
a dqv:Metric ;
skos:definition "It is checked whether a distributions's dct:format property resembles the actual format of the linked file."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:interoperability .
pv:syntaxValid
a dqv:Metric ;
skos:definition "It is checker whether a file's content is syntactically valid against the format's specification."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:interoperability .
pv:atLeastFourStars
a dqv:Metric ;
skos:definition "Checks if the dataset got at least a four stars rating." ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:interoperability .
# Reusability
pv:licenceAvailability
a dqv:Metric ;
skos:definition "It is checked whether dct:license is specified in a distribution."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:reusability .
pv:knownLicence
a dqv:Metric ;
skos:definition "It is checked if a distribution&apos;s licence is part of a predefined collection."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:reusability .
pv:accessRightsAvailability
a dqv:Metric ;
skos:definition "It is checked whether dct:accessRights is specified in a dataset."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:reusablity .
pv:accessRightsVocabularyAlignment
a dqv:Metric ;
skos:definition "Checks if a dataset&apos;s dct:accessRights is aligned to the controlled vocabulary specified by DCAT-AP."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:reusablity .
pv:contactPointAvailability
a dqv:Metric ;
skos:definition "It is checked whether dcat:contactPoint is specified in a dataset."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:reusability .
pv:publisherAvailability
a dqv:Metric ;
skos:definition "It is checked whether a dct:publisher is specified in a dataset."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:reusability .
# Contextuality
pv:rightsAvailability
a dqv:Metric ;
skos:definition "It is checked whether dct:rights is specified in a distribution."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:contextuality .
pv:byteSizeAvailability
a dqv:Metric ;
skos:definition "It is checked whether dcat:byteSize is specified in a distribution."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:contextuality .
pv:dateIssuedAvailability
a dqv:Metric ;
skos:definition "It is checked whether dct:issued is specified in a distribution."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:contextuality .
pv:dateModifiedAvailability
a dqv:Metric ;
skos:definition "It is checked whether dct:modified is specified in a distribution."@en ;
dqv:expectedDataType xsd:boolean ;
dqv:inDimension pv:contextuality .
pv:score
a dqv:Metric ;
skos:definition "It is calculated a score from the measurements results based on the corresponding score values."@en ;
dqv:expectedDataType xsd:integer ;
dqv:inDimension pv:contextuality .
# additional properties
pv:trueScore
a rdfs:Property .
pv:falseScore
a rdfs:Property .
This diff is collapsed.
<?xml version="1.0" encoding="utf-8" ?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:edp="https://europeandataportal.eu/voc#">
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/CSV">
<edp:isMachineReadable rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isMachineReadable>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/GEOJSON">
<edp:isMachineReadable rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isMachineReadable>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/ICS">
<edp:isMachineReadable rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isMachineReadable>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/JSON">
<edp:isMachineReadable rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isMachineReadable>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/JSON_LD">
<edp:isMachineReadable rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isMachineReadable>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/KML">
<edp:isMachineReadable rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isMachineReadable>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/KMZ">
<edp:isMachineReadable rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isMachineReadable>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/NETCDF">
<edp:isMachineReadable rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isMachineReadable>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/ODS">
<edp:isMachineReadable rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isMachineReadable>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/RDFA">
<edp:isMachineReadable rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isMachineReadable>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/RDF_N_QUADS">
<edp:isMachineReadable rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isMachineReadable>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/RDF_N_TRIPLES">
<edp:isMachineReadable rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isMachineReadable>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/RDF_TRIG">
<edp:isMachineReadable rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isMachineReadable>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/RDF_TURTLE">
<edp:isMachineReadable rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isMachineReadable>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/RDF_XML">
<edp:isMachineReadable rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isMachineReadable>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/RSS">
<edp:isMachineReadable rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isMachineReadable>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/SHP">
<edp:isMachineReadable rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isMachineReadable>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/XLS">
<edp:isMachineReadable rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isMachineReadable>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/XLSX">
<edp:isMachineReadable rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isMachineReadable>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/XML">
<edp:isMachineReadable rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isMachineReadable>
</rdf:Description>
</rdf:RDF>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8" ?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:edp="https://europeandataportal.eu/voc#">
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/BMP">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/CSV">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/DBF">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/GEOJSON">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/GZIP">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/HTML">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/ICS">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/JPEG2000">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/JSON">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/JSON_LD">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/KML">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/KMZ">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/NETCDF">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/ODS">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/PNG">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/RDF_N_QUADS">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/RDF_N_TRIPLES">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/RDF_TRIG">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/RDF_TURTLE">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/RDF_XML">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/RSS">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/RTF">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/TAR">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/TIFF">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/TSV">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/TXT">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/WMS_SRVC">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/XML">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
<rdf:Description rdf:about="http://publications.europa.eu/resource/authority/file-type/ZIP">
<edp:isNonProprietary rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</edp:isNonProprietary>
</rdf:Description>
</rdf:RDF>
\ No newline at end of file
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:skos="http://www.w3.org/2004/02/skos/core#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<skos:ConceptScheme rdf:about="https://piveau.eu/ns/scoring#scoring">
<rdfs:label>Scoring</rdfs:label>
<skos:prefLabel xml:lang="en">Scoring</skos:prefLabel>
</skos:ConceptScheme>
<skos:Concept rdf:about="https://piveau.eu/ns/scoring#excellent">
<skos:inScheme rdf:resource="https://piveau.eu/ns/scoring#scoring" />
<dc:description xml:lang="en">A scoring value greater than 350.</dc:description>
<dc:identifier>EXCELLENT</dc:identifier>
<skos:prefLabel xml:lang="en">Excellent</skos:prefLabel>
</skos:Concept>
<skos:Concept rdf:about="https://piveau.eu/ns/scoring#good">
<skos:inScheme rdf:resource="https://piveau.eu/ns/scoring#scoring" />
<dc:description xml:lang="en">A scoring value between 221 and 350.</dc:description>
<dc:identifier>GOOD</dc:identifier>
<skos:prefLabel xml:lang="en">Good</skos:prefLabel>
</skos:Concept>
<skos:Concept rdf:about="https://piveau.eu/ns/scoring#enough">
<skos:inScheme rdf:resource="https://piveau.eu/ns/scoring#scoring" />
<dc:description xml:lang="en">A scoring value between 120 and 220.</dc:description>
<dc:identifier>ENOUGH</dc:identifier>
<skos:prefLabel xml:lang="en">Enough</skos:prefLabel>
</skos:Concept>
<skos:Concept rdf:about="https://piveau.eu/ns/scoring#bad">
<skos:inScheme rdf:resource="https://piveau.eu/ns/scoring#scoring" />
<dc:description xml:lang="en">A scoring value less than 120.</dc:description>
<dc:identifier>BAD</dc:identifier>
<skos:prefLabel xml:lang="en">Bad</skos:prefLabel>
</skos:Concept>
</rdf:RDF>
package de.landsh.opendata;
import org.apache.commons.io.FileUtils;
import org.apache.jena.rdf.model.*;
import org.junit.Test;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.HashSet;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class FixBrokenDcatFilesTest {
@Test
public void fixFile() throws IOException {
final File file = new File(getClass().getResource("/148.ttl").getFile());
final File tempFile = File.createTempFile("data", "ttl");
tempFile.deleteOnExit();
FileUtils.copyFile(file, tempFile);
FixBrokenDcatFiles.fixFile(tempFile);
final Model model = ModelFactory.createDefaultModel();
model.read(new FileReader(tempFile), "", "TTL");
Set<String> subjects = getSubjectURIs(model);
assertEquals(3,subjects.size());
assertTrue(subjects.contains("https://ckan.www.open.nrw.de/dataset/b32de71c-6045-4348-9ca7-31008d9a8ac6"));
assertTrue(subjects.contains("https://ckan.www.open.nrw.de/dataset/fee85fc5-2522-4234-8f67-726c4848baad/resource/e88e1fa5-6495-4c96-a525-8628fb7c78ee"));
assertTrue(subjects.contains("https://ckan.www.open.nrw.de/dataset/b3f15c00-8ac0-460f-9788-ed7ff0409357/resource/25cadb30-651f-48e9-8fe0-7664c5c8ceec"));
}
private static Set<String> getSubjectURIs(Model model) {
final Set<String> result = new HashSet<>();
final ResIterator it = model.listSubjects();
while (it.hasNext()) {
Resource resource = it.next();
if( resource.getURI() != null) {
result.add(resource.getURI());
}
}
return result;
}
}
@prefix adms: <http://www.w3.org/ns/adms#> .
@prefix dcat: <http://www.w3.org/ns/dcat#> .
@prefix dcatde: <http://dcat-ap.de/def/dcatde/> .
@prefix dct: <http://purl.org/dc/terms/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix gsp: <http://www.opengis.net/ont/geosparql#> .
@prefix hydra: <http://www.w3.org/ns/hydra/core#> .
@prefix locn: <http://www.w3.org/ns/locn#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix schema: <http://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix spdx: <http://spdx.org/rdf/terms#> .
@prefix time: <http://www.w3.org/2006/time> .
@prefix vcard: <http://www.w3.org/2006/vcard/ns#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
<https://ckan.www.open.nrw.de/dataset/b32de71c-6045-4348-9ca7-31008d9a8ac6> a dcat:Dataset ;
dcatde:contributorID <http://dcat-ap.de/def/contributors/openNRW>,
<https://opendata.duesseldorf.de> ;
dcatde:maintainer [ a foaf:Organization ;
foaf:name "Landeshauptstadt Düsseldorf" ] ;
dct:creator [ a foaf:Organization ;
foaf:mbox "opendata@duesseldorf.de" ;
foaf:name "Landeshauptstadt Düsseldorf" ] ;
dct:description """<p>Der Datensatz enthält die jeweils aktuellste Datei mit den Werten für Stickoxide von den beiden städtischen Messstationen. Die Dateien in diesem Datensatz werden einmal pro Stunde um Messwerte für Stickstoffmonoxid und Stickstoffdioxid ergänzt. Die Werte sind in µg/m³ angegeben.</p>
<p>Die <a href="https://opendata.duesseldorf.de/dataset/luftmesswerte-f%C3%BCr-stickoxide-zeitreihen-der-st%C3%A4dtischen-messstellen" target="_blank" title="Zeitreihen Stickoxidwerte">Zeitreihen</a> und die <a href="https://opendata.duesseldorf.de/dataset/luftmesswerte-f%C3%BCr-stickoxide-jahresmittelwerte-d%C3%BCsseldorf-seit-1995" target="_blank" title="Jahresmittelwerte Stickoxide">Jahresmittelwerte</a> für Stickoxide in Düsseldorf sind in entsprechenden Datensätzen gespeichert. Ebenso die Daten über die anderen Schadstoffe <a href="https://opendata.duesseldorf.de/dataset/luftmesswerte-f%C3%BCr-benzol-jahresmittelwerte-d%C3%BCsseldorf-seit-1995" target="_blank" title="Jahresmittelwerte Benzol">Benzol</a>, <a href="https://opendata.duesseldorf.de/dataset/luftmesswerte-f%C3%BCr-ozon-%C3%BCberschreitungen-der-grenzwerte-d%C3%BCsseldorf" target="_blank" title="Ozon Grenzwertüberschreitungen">Ozon</a>, <a href="https://opendata.duesseldorf.de/dataset/luftmesswerte-f%C3%BCr-ru%C3%9F-jahresmittelwerte-d%C3%BCsseldorf-seit-1995" target="_blank" title="Jahresmittelwerte Ruß">Ruß </a>und <a href="https://opendata.duesseldorf.de/dataset/luftmesswerte-f%C3%BCr-feinstaub-tageswerte-d%C3%BCsseldorf" target="_blank" title="Tageswerte Feinstaub">Tageswerte für Feinstaub</a>.</p>
<p>Neben den Archivdaten für Feinstaub werden auch Daten zu <a href="https://opendata.duesseldorf.de/dataset/luftmesswerte-f%C3%BCr-feinstaub-anzahl-%C3%BCberschreitungstage-d%C3%BCsseldorf" target="_blank" title="Feinstaub Überschreitungstage">Überschreitungstagen</a> und <a href="https://opendata.duesseldorf.de/dataset/luftmesswerte-f%C3%BCr-feinstaub-jahresmittelwerte-d%C3%BCsseldorf-seit-1995" target="_blank" title="Feinstaub Jahresmittelwerte">Jahresmittelwerten</a> bereitgestellt.</p>
<p>Die Landeshauptsstadt Düsseldorf führt Luftqualitätsmessungen durch und bewertet die Ergenisse anhand der gesetzlichen Grundlagen. Aktuell ist es das Bundesimmissionsschutzgesetz in Kombination mit der 39. Bundesimmissionschutz-Verordnung.<br />
Weitere Informationen finden Sie auf der Seite '<a href="https://www.duesseldorf.de/umweltamt/umweltthemen-von-a-z/luft.html" target="_blank" title="Umweltamt Düsseldorf Luftqualität">Luftqualität</a>' des Umweltamtes. Die Werte der städtischen Messstationen an der <a href="https://www.duesseldorf.de/umweltamt/umweltthemen-von-a-z/luft/luftmesswerte/luftmesswerte-auf-der-dorotheenstrasse.html" target="_blank" title="Aktuelle Luftmesswerte Dorotheenstraße">Dorotheenstraße</a> und der <a href="https://www.duesseldorf.de/umweltamt/umweltthemen-von-a-z/luft/luftmesswerte/luftmesswerte-auf-der-brinckmannstrasse.html" target="_blank" title="Aktuelle Luftmesswerte Brinckmannstraße">Brinckmannstraße</a> werden stündlich aktualisiert.</p>
<p>Die <a href="https://opendata.duesseldorf.de/dataset/luftmesswerte-standorte-der-st%C3%A4dtischen-messstationen" target="_blank" title="Standorte der Messstationen">Geoinformationen</a> der städtischen Messstationen sind in einem eigenen Datensatz verfügbar.</p>
<p>Die Datei mit den aktuellen werten für Stickoxide enthalten folgende Spalteninformationen:</p>
<ul><li>Messzeitpunkt: Datum und Uhrzeit der Messungen</li>
<li>Stickstoffmonoxid: Aktuelle Messwerte für NO (Stickstoffmonoxid) in µg/m³</li>
<li>Stickstoffdioxid: Aktuelle Messwerte für NO2 (Stickstoffdioxid) in µg/m³</li>
</ul><p> </p>
""" ;
dct:identifier "b32de71c-6045-4348-9ca7-31008d9a8ac6" ;
dct:issued "2018-11-15T09:51:54+01:00"^^xsd:dateTime ;
dct:modified "2020-04-06T09:47:18+02:00"^^xsd:dateTime ;
dct:publisher <https://ckan.www.open.nrw.de/organization/b209b0fc-4465-4ba7-925e-38ac564fd525> ;
dct:title "Luftmesswerte für Stickoxide - Die aktuellen Werte von Düsseldorf" ;
adms:identifier "b32de71c-6045-4348-9ca7-31008d9a8ac6" ;
dcat:contactPoint [ a vcard:Organization ;
vcard:fn "Landeshauptstadt Düsseldorf" ;
vcard:hasEmail <mailto:opendata@duesseldorf.de> ] ;
dcat:distribution <https://ckan.www.open.nrw.de/dataset/b32de71c-6045-4348-9ca7-31008d9a8ac6/resource/5f639492-5773-49a7-aa5c-31f54cd6327c>,
<https://ckan.www.open.nrw.de/dataset/b32de71c-6045-4348-9ca7-31008d9a8ac6/resource/b8c48fa3-7160-43b6-825f-75adab558946> ;
dcat:keyword "open-data-düsseldorf" ;
dcat:landingPage <https://opendata.duesseldorf.de/dataset/luftmesswerte-f%C3%BCr-stickoxide-die-aktuellen-werte-von-d%C3%BCsseldorf> ;
dcat:theme <http://publications.europa.eu/resource/authority/data-theme/ENVI> .
<https://ckan.www.open.nrw.de/dataset/b32de71c-6045-4348-9ca7-31008d9a8ac6/resource/5f639492-5773-49a7-aa5c-31f54cd6327c> a dcat:Distribution ;
dct:description """<p>CSV-Datei mit fortlaufend aktualisierten Werten der Messstation an der Dorotheenstraße.</p>
<p>Jede Stunde um 5 Minuten nach wird diese Datei um die aktuellen Werte für Stickstoffmonoxid und Stickstoffdioxid ergänzt.</p>
""" ;
dct:format <http://publications.europa.eu/resource/authority/file-type/CSV> ;
dct:language <http://publications.europa.eu/resource/authority/language/DEU> ;
dct:license <https://www.govdata.de/dl-de/zero-2-0> ;
dcat:accessURL <http://%3C%21--
This%20file%20is%20not%20used%20by%20Drupal%20core%2C%20which%20uses%20theme%20functions%20instead.
See%20http://api.drupal.org/api/function/theme_field/7%20for%20details.
After%20copying%20this%20file%20to%20your%20theme%27s%20folder%20and%20customizing%20it%2C%20remove%20this
HTML%20comment.
--%3E
%3Cdiv%20class=%22field%20field-name-field-link-remote-file%20field-type-file%20field-label-hidden%22%3E
%20%20%20%20%3Cdiv%20class=%22field-items%22%3E
%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class=%22field-item%20even%22%3Ehttps://www.duesseldorf.de/fileadmin/rawdata/luft/Dorotheenstrasse.csv%3C/div%3E
%20%20%20%20%20%20%3C/div%3E
%3C/div%3E> .
<https://ckan.www.open.nrw.de/dataset/fee85fc5-2522-4234-8f67-726c4848baad/resource/e88e1fa5-6495-4c96-a525-8628fb7c78ee> a dcat:Distribution ;
dct:description """<p>JSON-Datei der Wohnbevölkerung insgesamt für die einzelnen Wohnquartiere nach Meldeverhältnis in Düsseldorf für das Jahr 2017</p>
""" ;
dct:format <http://publications.europa.eu/resource/authority/file-type/JSON> ;
dct:language <http://publications.europa.eu/resource/authority/language/DEU> ;
dct:license <https://www.govdata.de/dl-de/zero-2-0> ;
dcat:accessURL <https://opendata.duesseldorf.de/api/action/datastore/search.json?resource_id=9f1d8582-a550-44a5-b781-af76d48b1fd1> .
<https://ckan.www.open.nrw.de/dataset/dcf6b6f7-9651-4ea5-96bc-137ed4bc3b6f/resource/273992a0-87cc-4ace-94b9-7fdcd0108fa4> a dcat:Distribution ;
dct:description """<p>GPX-Datei der Laufstrecke "Zoopark"</p>
<p>Insbesondere für <strong>Laufeinsteiger*innen </strong>eignet sich die rund <strong>1,7 km</strong> lange Runde durch den <strong>Zoopark </strong>im Stadtteil Düsseltal. Im zweiten Weltkrieg zerstört, ist der ehemalige Tierpark im Jahr 1951 von Ulrich Wolf zum Stadtteilpark umgebaut worden und bietet Sportlerinnen und Sportlern eine paradiesische Laufrunde. Eine <strong>durchgehende Beleuchtung</strong> macht das Laufen zu jeder Zeit möglich.</p>
<p>Der Start kann beliebig gewählt werden. Kostenpflichtiges Parken ist am Eisstadion möglich. Für diejenigen, die mit dem <acronym title="Öffentlicher Personennahverkehr">ÖPNV</acronym> anreisen möchten, sind die Haltestellen "Grünerstraße" und "Brehmplatz" zu nutzen.</p>
<table class="contenttable stacktable large-only"><tbody><tr><td>Stadtteil</td>
<td>Düsseltal</td>
</tr><tr><td>Start und Ziel</td>
<td>beliebig, kostenpflichtiges Parken am Eisstadion möglich</td>
</tr><tr><td>Beschreibung</td>
<td>Rundkurs im alten Tierpark</td>
</tr><tr><td>Streckenbeschaffenheit</td>
<td>Asphalt- und Parkboden</td>
</tr><tr><td>Beleuchtung</td>
<td>vorhanden</td>
</tr></tbody></table><p>Weitere Informationen: <a href="https://www.duesseldorf.de/sportamt/laufen-in-duesseldorf/zoopark.html" target="_blank" title="Link zur Laufstrecke Zoopark">https://www.duesseldorf.de/sportamt/laufen-in-duesseldorf/zoopark.html</a></p>
""" ;
dct:format "gpx" ;
dct:language <http://publications.europa.eu/resource/authority/language/DEU> ;
dct:license <https://www.govdata.de/dl-de/zero-2-0> ;
dcat:accessURL <http://%3C%21--
This%20file%20is%20not%20used%20by%20Drupal%20core%2C%20which%20uses%20theme%20functions%20instead.
See%20http://api.drupal.org/api/function/theme_field/7%20for%20details.
After%20copying%20this%20file%20to%20your%20theme%27s%20folder%20and%20customizing%20it%2C%20remove%20this
HTML%20comment.
--%3E
%3Cdiv%20class=%22field%20field-name-field-link-remote-file%20field-type-file%20field-label-hidden%22%3E
%20%20%20%20%3Cdiv%20class=%22field-items%22%3E
%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class=%22field-item%20even%22%3Ehttps://www.duesseldorf.de/fileadmin/Amt52/laufen_in_duesseldorf/laufstrecken/GPS_Track_Zoopark.gpx%3C/div%3E
%20%20%20%20%20%20%3C/div%3E
%3C/div%3E> .
<https://ckan.www.open.nrw.de/dataset/b3f15c00-8ac0-460f-9788-ed7ff0409357/resource/25cadb30-651f-48e9-8fe0-7664c5c8ceec> a dcat:Distribution ;
dct:description """<p>CSV-Datei des täglichen Wasserstand des Rheins um 5.00 Uhr am Düsseldorfer Pegel für das Jahr 2002</p>
""" ;
dct:format <http://publications.europa.eu/resource/authority/file-type/CSV> ;
dct:language <http://publications.europa.eu/resource/authority/language/DEU> ;
dct:license <https://www.govdata.de/dl-de/zero-2-0> ;
dcat:accessURL <https://opendata.duesseldorf.de/sites/default/files/Rheinpegel_Tag%202002_0.csv> .
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment