Skip to content

Instantly share code, notes, and snippets.

@lawlesst
Last active June 29, 2017 19:05
Show Gist options
  • Save lawlesst/4429683 to your computer and use it in GitHub Desktop.
Save lawlesst/4429683 to your computer and use it in GitHub Desktop.
Reading and writing RDF for VIVO using RDFAlchemy.
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
@zhiboz
Copy link

zhiboz commented Jun 29, 2017

thanks for sharing! i guess the second to last line should read:

faculty = FacultyMember.get_by(people_id='3958')

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment