Example #1
0
def _format(format):
    g = Graph()
    g.add((g.identifier, RDF.type, DC.IMT))
    g.add((g.identifier, RDF.value, Literal(format)))
    g.add((g.identifier, RDFS.label, Literal(format)))
    return g
Example #2
0
def dict_produce(data):
    uri = URIRef(data['ckan_url']) if 'ckan_url' in data else BNode()
    rec = Graph(identifier=uri)
    rec.remove((None, None, None))

    rec.add((uri, RDF.type, DCAT.Dataset))
    rec.add((uri, OWL.sameAs, UUID[data["id"]]))
    rec.add((uri, DC.identifier, Literal(data["name"])))

    if data["url"] is not None and data["url"].strip():
        rec.add((uri, FOAF.homepage, URIRef(data["url"].strip())))

    if data["title"] is not None:
        rec.add((uri, RDFS.label, Literal(data["title"])))
        rec.add((uri, DC.title, Literal(data["title"])))
    else:
        rec.add((uri, RDFS.label, Literal(data["name"])))

    if data["notes"] is not None:
        rec.add((uri, DC["description"], Literal(data["notes"])))
    if data["license_id"] is not None:
        rec.add((uri, DC["rights"], LICENSES[data["license_id"]]))

    author = BNode()
    if data["author"] or data["author_email"]:
        rec.add((uri,DC.creator, author))
    if data["author"]:
        rec.add((author,FOAF.name, Literal(data["author"])))
    if data["author_email"]:
        rec.add((author,FOAF.mbox, URIRef("mailto:" + data["author_email"])))

    maintainer = BNode()
    if data["maintainer"] or data["maintainer_email"]:
        rec.add((uri,DC.contributor, maintainer))
    if data["maintainer"]:
        rec.add((maintainer,FOAF.name, Literal(data["maintainer"])))
    if data["maintainer_email"]:
        rec.add((maintainer,FOAF.mbox, URIRef("mailto:" + data["maintainer_email"])))

    for tag in data["tags"]:
        rec.add((uri, DCAT.keyword, Literal(tag)))

    if "ratings_average" in data and data["ratings_average"] is not None:
        rec.add((uri,REV.rating,
                 Literal(data["ratings_average"], datatype=XSD.float)))

    for rdata in data["resources"]:
        _process_resource(rec, uri, rdata)

    for k,v in data["extras"].items():
        _process_extra(rec, uri, k, v)

    for rdata in data["relationships"]:
        _process_relationship(rec, uri, rdata)

    ## TODO handle groups and version
    return rec
Example #3
0
    def tordf(self, id, format):
        graph = Graph()
        pkg = Package.get(id)
        if pkg:
            data = pkg.as_dict()
            metadoc = URIRef('')
            user = None
            if pkg.roles:
                owner = [role for role in pkg.roles if role.role == 'admin']
                if len(owner):
                    user = User.get(owner[0].user_id)
            profileurl = ""
            if user:
                profileurl = URIRef(config.get('ckan.site_url', '') +\
                    h.url_for(controller="user", action="read", id=user.name))
            graph.add((metadoc, DC.identifier, Literal(data["id"])\
                                if 'identifier' not in data["extras"]\
                                else URIRef(data["extras"]["identifier"])))
            graph.add((metadoc, DC.modified, Literal(data["metadata_modified"],
                                                 datatype=XSD.dateTime)))
            graph.add((metadoc, FOAF.primaryTopic, Identifier(data['name'])))
            uri = URIRef(data['name'])
            if data["license"]:
                graph.add((uri, DC.rights, Literal(data["license"])))
            if "versionPID" in data["extras"]:
                graph.add((uri, DC.identifier, Literal(data["extras"]["versionPID"])))
            graph.add((uri, DC.identifier, Literal(data["name"])))
            graph.add((uri, DC.modified, Literal(data.get("version", ''),
                                                 datatype=XSD.dateTime)))
            org = URIRef(FOAF.Person)
            if profileurl:
                graph.add((uri, DC.publisher, profileurl))
                graph.add((profileurl, RDF.type, org))
                graph.add((profileurl, FOAF.name, Literal(data["extras"]["publisher"])))
                graph.add((profileurl, FOAF.phone, Identifier(data["extras"]["phone"])))
                graph.add((profileurl, FOAF.homepage, Identifier(data["extras"]["contactURL"])))
                graph.add((uri, DC.rightsHolder, URIRef(data["extras"]["owner"])
                                                if data["extras"]["owner"].startswith(('http','urn'))\
                                                else Literal(data["extras"]["owner"])))
            log.debug(data["extras"])
            if all((k in data["extras"] and data["extras"][k] != "") for k in ("project_name",\
                                                 "project_homepage",\
                                                 "project_funding",\
                                                 "funder")):
                project = URIRef(FOAF.Project)
                projecturl = URIRef(data["extras"]["project_homepage"])
                graph.add((uri, DC.contributor, projecturl))
                graph.add((projecturl, RDF.type, project))
                graph.add((projecturl, FOAF.name, Literal(data["extras"]["project_name"])))
                graph.add((projecturl, FOAF.homepage, Identifier(data["extras"]["project_homepage"])))
                graph.add((projecturl, RDFS.comment,
                            Literal(data["extras"]["project_funder"])))
            for key in data["extras"]:
                log.debug(key)
                if key.startswith('author'):
                    graph.add((uri, DC.creator, URIRef(data["extras"][key])\
                                                if data["extras"][key].startswith(('http','urn'))\
                                                else Literal(data["extras"][key])))
                if key.startswith("title"):
                    lastlangnum = key.split('_')[-1]
                    log.debug(lastlangnum)
                    lastlang = data["extras"]["lang_title_%s" % lastlangnum]
                    graph.add((uri, DC.title, Literal(data["extras"][key],
                                        lang=lastlang)))
            for tag in data['tags']:
                graph.add((uri, DC.subject, Literal(tag)))
            for lang in data["extras"].get("language", "").split(','):
                graph.add((uri, DC.language, Literal(lang.strip())))
            if "access" in data["extras"]:
                graph.add((uri, DC.rights, self._make_rights_element(data["extras"])))

            # Extended metadatamodel

            if all(k in data["extras"] for k in ("temporal_coverage_begin",
                                                  "temporal_coverage_end")):
                graph.add((uri, DC.temporal, Literal(self._make_temporal(data["extras"]))))
            if "geographical_coverage" in data["extras"]:
                graph.add((uri, DC.spatial, Literal(data["extras"]["geographical_coverage"])))
            for rel in Related.get_for_dataset(pkg):
                graph.add((uri, DC.isReferencedBy, Literal(rel.related.title)))
            if "notes_rendered" in data:
                graph.add((uri, DC.description, Literal(data["notes_rendered"])))

            response.headers['Content-type'] = 'text/xml'
            if format == 'rdf':
                format = 'pretty-xml'
            return graph.serialize(format=format)
        else:
            return ""