From 999ec103da82501f7de2535af2f5f02381d07f1a Mon Sep 17 00:00:00 2001
From: Ronan Klyne
Date: Thu, 9 Feb 2012 14:05:42 +0000
Subject: [PATCH 01/23] Added a set of unit tests for unicode support and some
fixes that they necessitated.
---
rdfgraph.py | 47 ++++++++++++++++++-------
test.py | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 133 insertions(+), 13 deletions(-)
diff --git a/rdfgraph.py b/rdfgraph.py
index 2a0598b..c029ab9 100644
--- a/rdfgraph.py
+++ b/rdfgraph.py
@@ -229,7 +229,7 @@ def read_uri(self, lst, allow_error=False, _cache=[], **k):
for datum in lst:
assert getattr(datum, 'isURIResource', False), "Can't load " +`datum`
try:
- self._load_uri(datum.uri, reload=reload, format=k.get('format', None))
+ self._load_uri(datum.uri(), reload=reload, format=k.get('format', None))
except:
if not allow_error:
raise
@@ -276,13 +276,15 @@ def _load_uri(self, uri, **k):
if 'format' in k:
k['format'] = self._parse_rdf_format(k['format'])
# Strip the fragment from this URI before caching it.
+ assert isinstance(uri, (str, unicode)), uri
import urlparse
uri_key = ''.join(urlparse.urlparse(uri)[:5])
if not reload and uri_key in self.loaded: return
self.loaded[uri_key] = True
+ CACHE_FORMAT = TURTLE
if uri in self.web_cache:
try:
- self.import_uri('file:///'+self.web_cache.get_path(uri), format=TURTLE)
+ self.import_uri('file:///'+self.web_cache.get_path(uri), format=CACHE_FORMAT)
except:
print "Error getting <"+uri+"> from cache"
raise
@@ -304,15 +306,34 @@ def _load_uri(self, uri, **k):
raise RuntimeError("Got HTML data", uri, data, mime)
data += f.read()
data = data.decode(enc)
- self.web_cache[uri] = data
+ self.engine.load_text(data, format)
+ # Then write the data to the cache.
g = Graph()
- g.import_uri('file:///'+self.web_cache.get_path(uri), format=format)
- data = g.to_string(format=TURTLE)
-# raise RuntimeError(data)
- reloaded = g.engine.load_text(data, format=TURTLE)
- assert reloaded, reloaded
- self.web_cache[uri] = data
+ g.read_text(data, format)
+ data2 = g.to_string(format=CACHE_FORMAT)
+ g.engine.load_text(data2, format=CACHE_FORMAT)
+ self.web_cache[uri] = data2
+
+ def file_uri(self, path):
+ import urllib
+ return 'file:'+urllib.pathname2url(path)
+
+ def load_file(self, path, **k):
+ if 'format' not in k:
+ with open(path, 'rb') as f:
+ data = f.read(1024)
+ k['format'] = self._sniff_format(data)
+ else:
+ k['format'] = self._parse_rdf_format(k['format'])
+ uri = self.file_uri(path)
+ self.import_uri(uri, **k)
+
+ def save_file(self, path, format='turtle'):
+ format = self._parse_rdf_format(format)
+ data = self.engine.to_string(format=format)
+ with open(path, 'wb') as f:
+ f.write(data)
def import_uri(self, uri, **k):
"Load data directly from a URI into the Jena model (uncached)"
@@ -1393,6 +1414,8 @@ def _mk_object(self, obj):
return obj.datum
else:
value = obj.value()
+ if isinstance(value, (str, unicode)):
+ value = JString(value)
return JObject(
self.get_model().createTypedLiteral(value),
JPackage(self._jena_pkg_name).rdf.model.RDFNode,
@@ -1430,13 +1453,13 @@ def load_uri(self, uri, format=None, allow_error=False):
else:
self.jena_model = jena
- def load_text(self, text, format=TURTLE):
+ def load_text(self, text, format=TURTLE, encoding='utf-8'):
format = self.get_jena_format(format)
self.debug("JENA load text "+format)
jena = self.get_model()
uri = "tag:string-input"
- if isinstance(text, unicode):
- text = text.encode('utf-8')
+ if not isinstance(text, unicode):
+ text = unicode(text, encoding)
jstr = JString(text)
input = JClass('java.io.StringReader')(jstr)
jena = jena.read(input, uri, format)
diff --git a/test.py b/test.py
index 378b22b..7e3eed4 100644
--- a/test.py
+++ b/test.py
@@ -9,11 +9,20 @@
class Test(unittest.TestCase):
verbose = False
+
+ def new_graph(self, g=None):
+ if g is None:
+ g = rdfgraph.Graph()
+ self.g = g
+
def setUp(self):
- self.g = rdfgraph.Graph()
+ self.new_graph()
def tearDown(self):
self.g = None
+ def file_data(self, data):
+ return TempFile(data)
+
SAMPLE_RDFXML = """
@@ -39,6 +48,26 @@ def tearDown(self):
"""
+class TempFile(object):
+ def __init__(self, data):
+ assert isinstance(data, str) # Only permit bytes here.
+ self.data = data
+
+ def __enter__(self):
+ import tempfile
+ tpl = tempfile.mkstemp()
+ fn, self.name = tpl
+ tf = open(self.name, 'wb')
+ tf.write(self.data)
+ tf.close()
+ return self.name
+
+ def __exit__(self, a,b,c):
+ try:
+ import os
+ os.remove(self.name)
+ except: pass
+
class TestRead(Test):
def test_read_XML(self):
self.g.load_rdfxml(SAMPLE_RDFXML)
@@ -105,6 +134,14 @@ def test_set(self, other=None):
self.failUnless(r['tag:p'])
self.assertEquals(r['tag:p'], other)
+ def test_set_char(self):
+ # Check single characters
+ r = self.g.get('tag:dummy1')
+ char = 'A'
+ r['tag:char'] = char
+ self.failUnless(r['tag:char'])
+ self.assertEquals(r['tag:char'], char)
+
def test_set_literal(self):
self.test_set(other=2)
self.test_set(other="Wibble")
@@ -212,7 +249,67 @@ def test_join(self):
lst1
)
+class TestUnicode(Test):
+
+ u_lit = u'\x9c' # What iso-8859-1 calls '\xa3' - the British Pound sign.
+ u_ttl = '''
+ @prefix xsd: .
+ "\xc2\x9c"^^xsd:string .
+ '''
+ _rel = 'tag:new_relation'
+ _res = 'tag:new_resource'
+
+ def assert_loaded(self, g=None):
+ if g is None:
+ g = self.g
+ ts = list(g.triples(None, None, None))
+ self.assertEquals(len(ts), 1)
+ self.assertEquals(self.u_lit, g[self._res][self._rel])
+
+ def assert_not_loaded(self, g=None):
+ if g is None:
+ g = self.g
+ ts = list(g.triples(None, None, None))
+ self.assertEquals(len(ts), 0)
+
+ def test_ttl_load(self):
+ self.g.load_turtle(self.u_ttl)
+ self.assert_loaded()
+
+ def test_ttl_load_file(self, use_cache=False):
+ import os
+ self.assert_not_loaded()
+ with self.file_data(self.u_ttl) as f:
+ self.failUnless(os.path.isfile(f), f)
+ with open(f, 'rb') as fp:
+ self.failUnless(fp, f)
+ if use_cache:
+ uri = self.g.file_uri(f)
+ self.g.load(uri)
+ else:
+ self.g.load_file(f)
+ self.assert_loaded()
+
+ def test_ttl_load_file_with_cache(self):
+ self.test_ttl_load_file(True)
+ def test_set_literal(self):
+ r = self.g[self._res]
+ r.set(self._rel, self.u_lit)
+ self.assertEquals(self.u_lit, self.g[self._res][self._rel])
+
+ def test_save_and_load(self):
+ import tempfile
+ fno, name = tempfile.mkstemp()
+ self.g.load_turtle(self.u_ttl)
+ self.assert_loaded()
+ self.g.save_file(name)
+
+ # The test of save is whether we can load it or not.
+ self.new_graph()
+ self.assert_not_loaded()
+ self.g.load_file(name)
+ self.assert_loaded()
if __name__ == '__main__':
import sys
From 6ad3e0772b415e2644534fcaead490d77e6fba67 Mon Sep 17 00:00:00 2001
From: Ronan Klyne
Date: Thu, 9 Feb 2012 15:51:03 +0000
Subject: [PATCH 02/23] Added bits of packaging+distribution framework.
---
LICENSE.txt | 13 +++++++++++++
MANIFEST.in | 3 +++
README.txt | 19 +++++++++++++++++++
setup.py | 15 +++++++++++++++
4 files changed, 50 insertions(+)
create mode 100644 LICENSE.txt
create mode 100644 MANIFEST.in
create mode 100644 README.txt
create mode 100644 setup.py
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..aa21393
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,13 @@
+Copyright 2011 Ronan Klyne
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..1aaa8fe
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,3 @@
+include config.ini
+include LICENSE.txt
+recursive-include graphite\Jena-2.6.4 *.jar
diff --git a/README.txt b/README.txt
new file mode 100644
index 0000000..22c8fe5
--- /dev/null
+++ b/README.txt
@@ -0,0 +1,19 @@
+
+
+Overview
+========
+
+Information on this project is currently being maintained at http://code.google.com/p/python-graphite/
+
+All comments gratefully recieved at python-graphite@rklyne.net
+
+
+Dependencies
+============
+This package depends on Python 2.6 and JPype - http://sourceforge.net/projects/jpype/.
+
+Installation command:
+====================
+
+python setup.py install
+
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..7614d55
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,15 @@
+
+from distutils.core import setup
+
+setup(
+ name='python-graphite',
+ version='0.2.0',
+ author='Ronan Klyne',
+ author_email='python-graphite@rklyne.net',
+ packages=['graphite'],
+ scripts=[],
+ url='http://code.google.com/p/python-graphite/',
+ license='LICENSE.txt',
+ description='A flexible RDF hacking library built on JPype and Jena',
+ long_description=open('README.txt').read(),
+)
From b66bf4cb1f7453f2e06c08316540c642cd5e41f9 Mon Sep 17 00:00:00 2001
From: Ronan Klyne
Date: Thu, 9 Feb 2012 15:56:43 +0000
Subject: [PATCH 03/23] Reorganised code base.
---
_cgi.py => examples/_cgi.py | 0
examples/explorer.py | 328 ++++++++++++++++++
run.py => examples/run.py | 16 +-
.../Jena-2.6.4}/README.txt | 0
.../Jena-2.6.4}/ReleaseNotes.txt | 0
.../Jena-2.6.4}/copyright.txt | 0
graphite/Jena-2.6.4/lib/arq-2.8.7.jar | Bin 0 -> 2217681 bytes
.../Jena-2.6.4}/lib/arq-2.8.8.jar | Bin
.../Jena-2.6.4}/lib/icu4j-3.4.4.jar | Bin
.../Jena-2.6.4}/lib/iri-0.8.jar | Bin
.../Jena-2.6.4}/lib/jena-2.6.4.jar | Bin
.../Jena-2.6.4}/lib/log4j-1.2.13.jar | Bin
.../Jena-2.6.4}/lib/slf4j-api-1.5.8.jar | Bin
.../Jena-2.6.4}/lib/slf4j-log4j12-1.5.8.jar | Bin
.../Jena-2.6.4}/lib/stax-api-1.0.1.jar | Bin
graphite/Jena-2.6.4/lib/wstx-asl-3.2.9.jar | Bin 0 -> 524224 bytes
.../Jena-2.6.4}/lib/xercesImpl-2.7.1.jar | Bin
.../Jena-2.6.4}/readme.html | 0
graphite/__init__.py | 2 +
config.ini => graphite/config.ini | 0
rdfgraph.py => graphite/rdfgraph.py | 0
test.py => test/test.py | 0
22 files changed, 338 insertions(+), 8 deletions(-)
rename _cgi.py => examples/_cgi.py (100%)
create mode 100644 examples/explorer.py
rename run.py => examples/run.py (91%)
rename {Jena-2.6.4 => graphite/Jena-2.6.4}/README.txt (100%)
rename {Jena-2.6.4 => graphite/Jena-2.6.4}/ReleaseNotes.txt (100%)
rename {Jena-2.6.4 => graphite/Jena-2.6.4}/copyright.txt (100%)
create mode 100644 graphite/Jena-2.6.4/lib/arq-2.8.7.jar
rename {Jena-2.6.4 => graphite/Jena-2.6.4}/lib/arq-2.8.8.jar (100%)
rename {Jena-2.6.4 => graphite/Jena-2.6.4}/lib/icu4j-3.4.4.jar (100%)
rename {Jena-2.6.4 => graphite/Jena-2.6.4}/lib/iri-0.8.jar (100%)
rename {Jena-2.6.4 => graphite/Jena-2.6.4}/lib/jena-2.6.4.jar (100%)
rename {Jena-2.6.4 => graphite/Jena-2.6.4}/lib/log4j-1.2.13.jar (100%)
rename {Jena-2.6.4 => graphite/Jena-2.6.4}/lib/slf4j-api-1.5.8.jar (100%)
rename {Jena-2.6.4 => graphite/Jena-2.6.4}/lib/slf4j-log4j12-1.5.8.jar (100%)
rename {Jena-2.6.4 => graphite/Jena-2.6.4}/lib/stax-api-1.0.1.jar (100%)
create mode 100644 graphite/Jena-2.6.4/lib/wstx-asl-3.2.9.jar
rename {Jena-2.6.4 => graphite/Jena-2.6.4}/lib/xercesImpl-2.7.1.jar (100%)
rename {Jena-2.6.4 => graphite/Jena-2.6.4}/readme.html (100%)
create mode 100644 graphite/__init__.py
rename config.ini => graphite/config.ini (100%)
rename rdfgraph.py => graphite/rdfgraph.py (100%)
rename test.py => test/test.py (100%)
diff --git a/_cgi.py b/examples/_cgi.py
similarity index 100%
rename from _cgi.py
rename to examples/_cgi.py
diff --git a/examples/explorer.py b/examples/explorer.py
new file mode 100644
index 0000000..4427394
--- /dev/null
+++ b/examples/explorer.py
@@ -0,0 +1,328 @@
+
+import cgi
+import cgitb
+cgitb.enable()
+
+fs = cgi.FieldStorage()
+
+class Response(object):
+ def __call__(self, data, type="text/html"):
+ data = str(data)
+ import sys
+ w = sys.stdout.write
+ def wl(text):
+ w(text+"\n")
+ wl("Status: 200 OK")
+ wl("Content-Type: " + type)
+ wl('')
+ w(data)
+ sys.stdout.flush()
+ import time
+ time.sleep(1)
+ sys.exit()
+
+import rdfgraph
+
+def main():
+ respond = Response()
+ import os
+
+ path = os.environ.get('PATH_INFO', '')
+ if path.endswith('/schema'):
+ return schema_explorer(respond)
+
+ if 'type' in fs:
+ show_data(respond)
+ else:
+ landing_page(respond)
+
+HTML = """
+
+
+Semantic web explorer
+
+
+
+
+
+%s
+
+
+"""
+
+def landing_page(respond):
+ respond(HTML % (
+ """RDF data explorer
+ This aims to provide the most useful summary possible of any RDF data source.
+
+ """
+ ))
+
+
+def chart(data, caption="", threshold=0.95):
+ "Renders an HTML chart. Data maps name to value."
+ lst = [(c, p) for (p, c) in data.items()]
+ lst.sort()
+ lst.reverse()
+ total = sum([c for (c, p) in lst])
+ if total == 0:
+ return caption+" No data!"
+ target = total * threshold
+ total = 0
+ for i, (c, p) in enumerate(lst):
+ total += c
+ if total > target:
+ break
+ i += 1
+ i = min(i, 8)
+ if i != len(lst):
+ extras = lst[i:]
+ extras_total = sum([c for (c, p) in extras])
+ lst = lst[:i]
+ lst.append((extras_total, "Others"))
+
+
+ return '\n'+caption+'' \
+ + ' | Count |
' \
+ + '
\n'.join(['| %s | %s | ' % (p, c) for (c, p) in lst]) \
+ + '
'
+
+
+def show_data(respond):
+ g = rdfgraph.Graph()
+ data_type = fs['type'].value
+ url = fs['url'].value
+
+ if url is None:
+ raise RuntimeError
+ if data_type == 'sparql':
+ g.add_endpoint(url)
+ elif data_type == 'http':
+ format = None
+ if url.endswith('.ttl'):
+ format = 'ttl'
+ g.load(url, format=format)
+ else:
+ return landing_page(respond)
+
+ def quote(thing):
+ return cgi.escape(unicode(thing))
+
+ result = ''
+ g.describe("<%s>" % (url,))
+
+ resource_count = int(g.sparql(" SELECT ( COUNT ( DISTINCT ?x ) AS ?c ) WHERE { ?x ?y ?z } ").count('c'))
+ property_count = int(g.sparql("select (count(distinct ?y) as ?c) where {?x ?y ?z}").count('c'))
+ object_count = int(g.sparql("select (count(distinct ?z) as ?c) where {?x ?y ?z}").count('c'))
+ triple_count = int(g.sparql("select (count(?z) as ?c) where {?x ?y ?z}").count('c'))
+ type_count = int(g.sparql("select (count(distinct ?z) as ?c) where {?x a ?z}").count('c'))
+ typed_resource_count = int(g.sparql("select (count(distinct ?x) as ?c) where {?x a ?z}").count('c'))
+
+ actions = [
+ (0, 'triples'),
+ (type_count, 'type'),
+ (property_count, 'property'),
+ (object_count, 'object'),
+ (resource_count, 'resource'),
+ ]
+ actions.sort()
+
+ for weight, action in actions:
+ if weight > 150:
+ result += "Too many %ss to summarise
"%action
+ continue
+ else:
+ result += "%s
"%action
+
+ if action == 'triples':
+ result += '' + chart({
+ 'Untyped resources': resource_count-typed_resource_count,
+ 'Typed resources': typed_resource_count,
+ 'Properties': property_count,
+ 'Objects': object_count,
+ }, caption="Unique URI counts", threshold=2)
+
+ explore_typed = False
+ if resource_count:
+ if typed_resource_count/resource_count < 0.1:
+ result += "Less than 10% of resources are typed. Maybe start looking there?
"
+ explore_typed = True
+
+ prop_to_res = resource_count/property_count
+ if prop_to_res < 2:
+ result += "There are nearly as many properties as resources. This is a web.
"
+ if prop_to_res > 5:
+ result += "There are several properties on each resource. This is concentrated information.
"
+
+ result += '''
+
'''
+
+ elif action == 'property':
+ if True:
+ props = dict([
+ (g.shrink_uri(d.get('y', '')), d['c'])
+ for d in
+ g.sparql("select ?y (count(?x) as ?c) where {?x ?y ?z} group by ?y order by desc(?c) limit 10")
+ if 'y' in d
+ ])
+ else:
+ ps = g.sparql("select distinct ?y where {?x ?y ?z} limit 50")['y']
+ props = {}
+ for p in ps:
+ resultlist = g.sparql("select (count(?x) as ?c) where {?x <%s> ?z}" % (p,))
+ c = resultlist.count('c')
+ props[p.shrink_uri()] = c
+ if props:
+ result += chart(props, caption="Property frequencies")
+
+ elif action == 'resource':
+
+ rs = g.sparql("select distinct ?x where {?x ?y ?z} limit 150")['x']
+ result += "" + str(len(list(rs))) + ' - ' + ', '.join(map(quote, rs)) + '
'
+
+
+ elif action == 'type':
+
+###
+ # for d in g.sparql("select ?z (count(distinct ?x) as ?c) where {?x a ?z} group by ?z order by desc(?c) limit 10"):
+ # raise RuntimeError(d)
+###
+
+ if True:
+ types = dict([
+ (d['z'], d['c'])
+ for d in
+ g.sparql("select ?z (count(distinct ?x) as ?c) where {?x a ?z} group by ?z order by desc(?c) limit 10")
+ if 'z' in d
+ ])
+ else:
+ ts = g.sparql("select distinct ?y where {?x a ?y} limit 50")['y']
+ types = {}
+ for t in ts:
+ resultlist = g.sparql("select (count(distinct ?x) as ?c) where {?x a <%s>}" % (t,))
+ c = resultlist.count('c')
+ types[t.short_html()] = int(c)
+ if types:
+ result += "Types (%s total)
\n" %type_count
+ result += chart(types, caption="Type frequencies")
+
+ elif action == 'object':
+ result += "Object summary not written
"
+
+ else:
+ raise RuntimeError("unknown action", action)
+
+ respond(
+ HTML % (
+ "%s
\n" % quote(url)
+ + result,
+ )
+ )
+
+
+
+def schema_explorer(respond):
+ if 'url' not in fs or 'json' not in fs:
+ #raise RuntimeError(fs.getvalue('url', None))
+ respond(HTML %"""RDF Schema explorer
+ (Reset)
+
+
+
+
+
+ Built using python-graphite and JavaScript InfoViz Toolkit
+
""")
+ else:
+ respond(schema_json(), type="application/json")
+
+
+def schema_json():
+ g = rdfgraph.Graph()
+ g.add_inference('schema')
+ url = fs['url'].value
+ prop = None
+ if 'property' in fs:
+ prop = fs['property'].value
+
+ format = 'ttl'
+ if url.endswith('.ttl'):
+ format = 'ttl'
+ g.load(url, format=format)
+ r = g[url]
+
+ if prop:
+ # defunct
+ data = {
+ 'subject': url,
+ 'property': prop,
+ 'values': [{
+ 'id': n.expand_uri(),
+ 'name': n.shrink_uri(),
+ } for n in g[url].all(prop)],
+ }
+
+ ns = r.get_ns()
+
+ import json
+
+ properties = []
+ data = {
+ 'name': r['rdfs:label'],
+ 'properties': properties,
+ }
+ domain_of = list(r.all('-rdfs:domain'))
+ for p in domain_of:
+ for r in p.all('rdfs:range'):
+ properties.append({
+ 'id': str(r),
+ 'name': "(" + p.shrink_uri() + ")" \
+ + r.shrink_uri() if hasattr(r, 'shrink_uri') else r,
+ })
+ return json.dumps(data)
diff --git a/run.py b/examples/run.py
similarity index 91%
rename from run.py
rename to examples/run.py
index 2061328..1578941 100644
--- a/run.py
+++ b/examples/run.py
@@ -1,7 +1,7 @@
-import rdfgraph
+import graphite
def main():
- e = rdfgraph.Graph()
+ e = graphite.Graph()
uri = "http://webscience.org/person/2.n3"
# uri = 'http://id.ecs.soton.ac.uk/person/1650'
e.load(uri)
@@ -19,7 +19,7 @@ def main():
print "People"
uri = "http://webscience.org/people.n3"
- g = rdfgraph.Graph().load(uri)
+ g = graphite.Graph().load(uri)
names = []
for person in g.all_of_type('foaf:Person').sort('foaf:family_name'):
print "-"*40
@@ -28,7 +28,7 @@ def main():
print ', '.join(map(str, names))
- print rdfgraph.Graph(). \
+ print graphite.Graph(). \
load("http://webscience.org/people"). \
sparql("PREFIX foaf: SELECT * WHERE { ?person a foaf:Person } LIMIT 5") \
['person']['foaf:name'].join(', ') \
@@ -42,7 +42,7 @@ def main2():
# Try playing with some Linked4 local govt. data
# ( http://linked4.org/lsd/ )
#
- graph = rdfgraph.Graph()
+ graph = graphite.Graph()
graph.load_sparql(
"http://linked4.org/lsd/sparql",
"""
@@ -63,7 +63,7 @@ def main3():
# Try playing with some Linked4 local govt. data
# ( http://linked4.org/lsd/ )
#
- data = rdfgraph.Dataset()
+ data = graphite.Dataset()
data.add_endpoint("http://linked4.org/lsd/sparql")
data.add_endpoint(dbpedia)
# Royal Borough of Windsor and Maidenhead
@@ -82,7 +82,7 @@ def main3():
def main4():
- graph = rdfgraph.Dataset()
+ graph = graphite.Dataset()
graph.add_endpoint("http://services.data.gov.uk/reference/sparql")
# graph.add_endpoint("http://linked4.org/lsd/sparql")
@@ -99,7 +99,7 @@ def main4():
def explore_types():
- graph = rdfgraph.Graph()
+ graph = graphite.Graph()
graph.add_endpoint("http://linked4.org/lsd/sparql")
print graph.all_types().get('rdfs:label').join(', ')
diff --git a/Jena-2.6.4/README.txt b/graphite/Jena-2.6.4/README.txt
similarity index 100%
rename from Jena-2.6.4/README.txt
rename to graphite/Jena-2.6.4/README.txt
diff --git a/Jena-2.6.4/ReleaseNotes.txt b/graphite/Jena-2.6.4/ReleaseNotes.txt
similarity index 100%
rename from Jena-2.6.4/ReleaseNotes.txt
rename to graphite/Jena-2.6.4/ReleaseNotes.txt
diff --git a/Jena-2.6.4/copyright.txt b/graphite/Jena-2.6.4/copyright.txt
similarity index 100%
rename from Jena-2.6.4/copyright.txt
rename to graphite/Jena-2.6.4/copyright.txt
diff --git a/graphite/Jena-2.6.4/lib/arq-2.8.7.jar b/graphite/Jena-2.6.4/lib/arq-2.8.7.jar
new file mode 100644
index 0000000000000000000000000000000000000000..3040a9969b490fda311e28999b1fdd58a8efa6c1
GIT binary patch
literal 2217681
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