RDF, Sparql query with python

Sun 13 September 2009
  • 手艺 tags:
  • python
  • rdf published: true comments: true

A simple query to test rdf and sparql.

[codesyntax lang="python"]
import sys
import rdflib
from rdflib.Graph import ConjunctiveGraph

g = ConjunctiveGraph()

g.parse(sys.argv[1], format="xml")

fbns = rdflib.Namespace("http://rdf.freebase.com/ns/")

player_refs = g.query("""SELECT ?player
WHERE {
?root fb:soccer.football_roster_position.player ?player .
}""", initNs={'fb':fbns})
players = []
for player in player_refs:
gp = ConjunctiveGraph()
gp.parse(player[0], format="xml")
results = gp.query("""SELECT ?player_name ?player_position
WHERE {
?player fb:type.object.name ?player_name .
?player fb:soccer.football_player.position_s ?player_position .
}""", initNs={'fb':fbns})
l = list(results)
for r in l:
if r[0].language == 'en':
players.append(r)

for player in players:
print player

[/codesyntax] The query will return all player-position tuple from freebase's db for specified resource.
To query for players of AC Milan, execute the script with resource location: python rdfquery.py http://rdf.freebase.com/rdf/en/ac_milan got: (rdflib.Literal('Yoann Gourcuff', language=u'en', datatype=None), rdflib.URIRef('http://rdf.freebase.com/ns/en.midfielder'))
(rdflib.Literal('Andrea Pirlo', language=u'en', datatype=None), rdflib.URIRef('http://rdf.freebase.com/ns/en.midfielder'))
(rdflib.Literal('Paolo Maldini', language=u'en', datatype=None), rdflib.URIRef('http://rdf.freebase.com/ns/en.defender'))
(rdflib.Literal('Gianluca Zambrotta', language=u'en', datatype=None), rdflib.URIRef('http://rdf.freebase.com/ns/en.defender'))
(rdflib.Literal('Davide Facchin', language=u'en', datatype=None), rdflib.URIRef('http://rdf.freebase.com/ns/guid.9202a8c04000641f8000000000c75e75'))
(rdflib.Literal('Marcus Plinio Diniz Paixao', language=u'en', datatype=None), rdflib.URIRef('http://rdf.freebase.com/ns/en.defender'))
...

All resources are stored as rdf:resource references. If you are also Milan fan like me, take a quick look at the players, well, the data is not up to date:)

I have also tried to fetch data for my favorite local team. python rdfquery.py http://rdf.freebase.com/rdf/en/jiangsu_shuntian
(rdflib.Literal('Yao Hanlin', language=u'en', datatype=None), rdflib.URIRef('http://rdf.freebase.com/ns/en.midfielder'))