Last active
June 29, 2017 19:05
-
-
Save lawlesst/4429683 to your computer and use it in GitHub Desktop.
Reading and writing RDF for VIVO using RDFAlchemy.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import csv | |
from pprint import pprint | |
import urllib | |
from rdflib import Namespace | |
from rdfalchemy import rdfSingle | |
from rdfalchemy.rdfSubject import rdfSubject | |
from rdflib import Literal, BNode, Namespace, URIRef | |
from rdflib import RDF, RDFS, Graph, OWL | |
from rdflib.namespace import XSD | |
foaf = Namespace('http://xmlns.com/foaf/0.1/') | |
core = Namespace('http://vivoweb.org/ontology/core#') | |
vitro = Namespace('http://vitro.mannlib.cornell.edu/ns/vitro/0.7') | |
local = Namespace('http://localhost/core/ontology/core-local#') | |
#Namespace for the vivo app | |
vivo_app_url = 'http://localhost/vivo/' | |
app = Namespace(vivo_app_url) | |
class Thing(rdfSubject): | |
rdf_type = OWL.Thing | |
label = rdfSingle(RDFS.label) | |
class Person(Thing): | |
rdf_type = foaf.Person | |
class FacultyMember(Person): | |
rdf_type = core.FacultyMember | |
firstname = rdfSingle(foaf.firstName) | |
middlename = rdfSingle(core.middleName) | |
lastname = rdfSingle(foaf.lastName) | |
work_email = rdfSingle(core.workEmail) | |
phone = rdfSingle(core.workPhone) | |
fax = rdfSingle(core.workFax) | |
research_overview = rdfSingle(core.researchOverview) | |
preferred_title = rdfSingle(core.preferredTitle) | |
moniker = rdfSingle(vitro.moniker) | |
people_id = rdfSingle(local.peopleID) | |
def get_graph(): | |
""" | |
Helper for getting a graph and binding namespaces. | |
""" | |
g = rdfSubject.db | |
#Bind the namespaces | |
g.bind('foaf', foaf) | |
g.bind('core', core) | |
g.bind('vitro', vitro) | |
g.bind('local', local) | |
return g | |
g = get_graph() | |
#Open the sample VIVO people file. | |
csv_url = 'http://iweb.dl.sourceforge.net/project/vivo/Data%20Ingest/people.csv' | |
people_file = urllib.urlopen(csv_url) | |
for count, row in enumerate(csv.DictReader(people_file)): | |
#Create a URI for the person. | |
person_uri = URIRef("%sfaculty%s" % (app, count + 1)) | |
fac = FacultyMember(person_uri) | |
fac.label = row.get('name').strip() | |
fac.people_id = row.get('person_ID') | |
fac.moniker = row.get('title') | |
fac.firstname = row.get('first') | |
middle_name = row.get('middle') | |
if middle_name is not None and middle_name != "": | |
fac.middlename = row.get('middle') | |
fac.lastname = row.get('last') | |
fac.work_email = row.get('email') | |
fac.phone = row.get('phone') | |
fac.fax = row.get('fax') | |
print g.serialize(format='n3') | |
g.close() | |
#Load the n3 file as a rdfSubject db. | |
people_n3 = 'http://iweb.dl.sourceforge.net/project/vivo/Data%20Ingest/people.n3' | |
rdfSubject.db.load(people_n3, format='n3') | |
#Get all of the assistant professors in the graph. | |
asst_professors = FacultyMember.filter_by(moniker="Assistant Professor") | |
print '\n' + '=' * 20 | |
print "Assistant Professors" | |
print '=' * 20 + '\n' | |
for fac in asst_professors: | |
#Print full name, email, and url to vivo profile. | |
print "%s\t%s\t%s" % (fac.label, fac.work_email, fac.resUri.toPython()) | |
#Use get_by to retrieve a single faculty member | |
faculty = FacultyMember.get_by(hr_id='3958') | |
print faculty.label |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
thanks for sharing! i guess the second to last line should read: