semantic_naming 2.0.0 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +7 -1
- data/lib/semantic_naming/namespace.rb +4 -4
- data/lib/semantic_naming/source_class.rb +55 -14
- data/lib/semantic_naming/uri.rb +8 -15
- data/lib/semantic_naming.rb +7 -0
- data/test/source_class_test.rb +7 -0
- metadata +36 -36
data/README.rdoc
CHANGED
@@ -1,3 +1,9 @@
|
|
1
1
|
= SemanticNaming
|
2
2
|
|
3
|
-
Semantic URL handling that can be used with the Talia system or ActiveRDF
|
3
|
+
Semantic URL handling that can be used with the Talia system or ActiveRDF. This contains
|
4
|
+
a number of methods of encoding semantic URIs, dealing with namespaces and providing a
|
5
|
+
neat interface to access URIs.
|
6
|
+
|
7
|
+
The library offers additional functionality when active_rdf is installed. Note that at this
|
8
|
+
point in time you should use the 'activerdf_net7' gem, as it's tuned to work with the
|
9
|
+
semantic naming. The default activerdf gem *will* cause problems.
|
@@ -19,10 +19,10 @@ module N
|
|
19
19
|
# (e.g. Onotology classes)
|
20
20
|
def elements_with_type(type, element_type = N::URI)
|
21
21
|
return unless(rdf_active? && is_iri?)
|
22
|
-
qry = ::Query.new.distinct.select(:s)
|
23
|
-
qry.where(:s,
|
24
|
-
qry.
|
25
|
-
qry.execute
|
22
|
+
qry = ::Query.new(element_type).distinct.select(:s)
|
23
|
+
qry.where(:s, RDF.type, type)
|
24
|
+
qry.filter_regexp(:s, "^#{@uri_s}")
|
25
|
+
qry.execute
|
26
26
|
end
|
27
27
|
|
28
28
|
# Returns a list of predicate names.
|
@@ -8,36 +8,77 @@ module N
|
|
8
8
|
# Get the supertype of this class
|
9
9
|
def supertypes
|
10
10
|
return nil unless(active_rdf? && is_iri?)
|
11
|
-
qry = Query.new.distinct.select(:o)
|
12
|
-
qry.where(
|
13
|
-
qry.where(:o,
|
14
|
-
qry.execute
|
11
|
+
qry = Query.new(SourceClass).distinct.select(:o)
|
12
|
+
qry.where(self, RDFS.subClassOf, :o)
|
13
|
+
qry.where(:o, RDF.type, RDFS.Class)
|
14
|
+
qry.execute
|
15
15
|
end
|
16
16
|
|
17
17
|
# Get the subtypes of this type
|
18
18
|
def subtypes
|
19
19
|
return nil unless(active_rdf? && is_iri?)
|
20
|
-
qry = Query.new.distinct.select(:s)
|
21
|
-
qry.where(:s,
|
22
|
-
qry.where(:s,
|
23
|
-
qry.execute
|
20
|
+
qry = Query.new(SourceClass).distinct.select(:s)
|
21
|
+
qry.where(:s, RDFS.subClassOf, self)
|
22
|
+
qry.where(:s, RDF.type, RDFS.Class)
|
23
|
+
qry.execute
|
24
24
|
end
|
25
25
|
|
26
26
|
# Get the instances of this type. return_type will be the class used to
|
27
27
|
# create the objects that are returned.
|
28
28
|
def instances(return_type)
|
29
29
|
return nil unless(active_rdf? && is_iri?)
|
30
|
-
qry = Query.new.distinct.select(:s)
|
31
|
-
qry.where(:s,
|
32
|
-
qry.execute
|
30
|
+
qry = Query.new(SourceClass).distinct.select(:s)
|
31
|
+
qry.where(:s, RDF.type, self)
|
32
|
+
qry.execute
|
33
33
|
end
|
34
34
|
|
35
35
|
# Get all the existing types from the RDF store
|
36
36
|
def self.rdf_types
|
37
37
|
return nil unless(URI.active_rdf?)
|
38
|
-
qry = Query.new.distinct.select(:s)
|
39
|
-
qry.where(:s,
|
40
|
-
qry.execute
|
38
|
+
qry = Query.new(SourceClass).distinct.select(:s)
|
39
|
+
qry.where(:s, RDF.type, RDFS.Class)
|
40
|
+
qry.execute
|
41
|
+
end
|
42
|
+
|
43
|
+
# Return a subclass hierarchy. This is quicker than going through
|
44
|
+
# the hierarchy step by step. It will look at all subclass (*not*
|
45
|
+
# superclass!) relationships and return a nested, tree-like structure
|
46
|
+
# build of hashes. Each key in the hash will be the class object, and
|
47
|
+
# the values are hashes with the child elements, and so on
|
48
|
+
#
|
49
|
+
# E.g. : { type1 => { subtype_a => {}, subtype_b => { xtype => {}} }, type_2 => {}}
|
50
|
+
def self.subclass_hierarchy
|
51
|
+
return nil unless(URI.active_rdf?)
|
52
|
+
types = rdf_types
|
53
|
+
qry = Query.new(SourceClass).distinct.select(:class, :subclass)
|
54
|
+
qry.where(:class, RDF.type, RDFS.Class)
|
55
|
+
qry.where(:subclass, RDFS.subClassOf, :class)
|
56
|
+
subtype_list = qry.execute
|
57
|
+
hierarchy = {}
|
58
|
+
# Sift through the triples and add the sub-items
|
59
|
+
subtype_list.each do |sub_items|
|
60
|
+
klass, subklass = sub_items
|
61
|
+
hierarchy[klass] ||= {}
|
62
|
+
hierarchy[klass][subklass] = true
|
63
|
+
end
|
64
|
+
|
65
|
+
# Now we link up the subclass relations
|
66
|
+
hierarchy.each do |key, values|
|
67
|
+
values.each_key do |subkey|
|
68
|
+
next if(subkey == :is_child)
|
69
|
+
hierarchy[subkey] ||= {}
|
70
|
+
values[subkey] = hierarchy[subkey]
|
71
|
+
values[subkey][:is_child] = true
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Join with the general types and remove the children
|
76
|
+
types.each do |type|
|
77
|
+
xtype = (hierarchy[type] ||= {})
|
78
|
+
hierarchy.delete(type) if(xtype.delete(:is_child))
|
79
|
+
end
|
80
|
+
|
81
|
+
hierarchy
|
41
82
|
end
|
42
83
|
|
43
84
|
end
|
data/lib/semantic_naming/uri.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'active_rdf'
|
2
1
|
module N
|
3
2
|
|
4
3
|
# This class contains basic functionality for URIs
|
@@ -70,9 +69,9 @@ module N
|
|
70
69
|
@uri_s
|
71
70
|
end
|
72
71
|
|
73
|
-
#
|
72
|
+
# YAML representation is the uri string
|
74
73
|
def to_yaml
|
75
|
-
|
74
|
+
self.to_s.to_yaml
|
76
75
|
end
|
77
76
|
|
78
77
|
# Alias "uri" for compatibility with ActiveRDF
|
@@ -140,7 +139,9 @@ module N
|
|
140
139
|
type = str.split(separator)
|
141
140
|
type = [type[1]] if(type[0] == "")
|
142
141
|
if(type.size == 2)
|
143
|
-
|
142
|
+
namespace = N::URI[type[0]]
|
143
|
+
raise(ArgumentError, "Unknown namespace #{type[0]} for #{str}") unless(namespace)
|
144
|
+
self.new(namespace + type[1])
|
144
145
|
else
|
145
146
|
default_namespace + type[0]
|
146
147
|
end
|
@@ -265,20 +266,10 @@ module N
|
|
265
266
|
URI.active_rdf?
|
266
267
|
end
|
267
268
|
|
268
|
-
# Create a resource from the given type
|
269
|
-
def self.make_res(type)
|
270
|
-
::RDFS::Resource.new(type.to_s)
|
271
|
-
end
|
272
|
-
|
273
|
-
# Instance convenience accessor
|
274
|
-
def make_res(type)
|
275
|
-
self.class.make_res(type)
|
276
|
-
end
|
277
|
-
|
278
269
|
# Gets the rdfs:labels from the rdf store
|
279
270
|
def rdfs_labels
|
280
271
|
if(active_rdf? && is_iri?)
|
281
|
-
labels =
|
272
|
+
labels = Query.new(N::URI).distinct.select(:label).where(self, N::RDFS.label, :label).execute
|
282
273
|
if(labels && labels.size > 0)
|
283
274
|
labels
|
284
275
|
end # else nil
|
@@ -302,5 +293,7 @@ module N
|
|
302
293
|
result
|
303
294
|
end
|
304
295
|
|
296
|
+
|
297
|
+
|
305
298
|
end
|
306
299
|
end
|
data/lib/semantic_naming.rb
CHANGED
@@ -6,6 +6,13 @@ this_dir = File.dirname(File.expand_path(file))
|
|
6
6
|
$: << this_dir
|
7
7
|
$: << this_dir + '/semantic_naming/'
|
8
8
|
|
9
|
+
require 'rubygems'
|
10
|
+
begin
|
11
|
+
require 'active_rdf'
|
12
|
+
rescue
|
13
|
+
puts "ActiveRDF not found"
|
14
|
+
end
|
15
|
+
|
9
16
|
require 'semantic_naming/uri'
|
10
17
|
require 'semantic_naming/default_namespaces'
|
11
18
|
require 'semantic_naming/namespace'
|
data/test/source_class_test.rb
CHANGED
@@ -43,4 +43,11 @@ class TypeTest < Test::Unit::TestCase
|
|
43
43
|
types = N::SourceClass.rdf_types.collect { |type| type.uri.to_s }
|
44
44
|
assert_equal([N::RDFTEST.Type1.to_s, N::RDFTEST.Type2.to_s, N::RDFTEST.Type3.to_s, N::RDFTEST.Type4.to_s].sort, types.sort)
|
45
45
|
end
|
46
|
+
|
47
|
+
def test_subclass_hierarchy
|
48
|
+
hierarchy = N::SourceClass.subclass_hierarchy
|
49
|
+
assert_equal({N::RDFTEST.Type1 => { N::RDFTEST.Type2 => {}, N::RDFTEST.Type3 => {} }, N::RDFTEST.Type4 => { N::RDFTEST.Type3 => {}}}, hierarchy)
|
50
|
+
end
|
51
|
+
|
52
|
+
|
46
53
|
end
|
metadata
CHANGED
@@ -1,26 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0
|
5
|
-
platform: ruby
|
6
|
-
authors:
|
7
|
-
- Daniel Hahn
|
8
|
-
autorequire:
|
9
|
-
bindir: bin
|
10
|
-
cert_chain: []
|
11
|
-
|
12
|
-
date: 2009-10-14 00:00:00 +02:00
|
13
|
-
default_executable:
|
14
|
-
dependencies: []
|
2
|
+
extensions: []
|
15
3
|
|
16
|
-
|
17
|
-
email: hahn@netseven.it
|
4
|
+
homepage: http://talia.discovery-project.eu/
|
18
5
|
executables: []
|
19
6
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
-
|
7
|
+
version: !ruby/object:Gem::Version
|
8
|
+
version: 2.0.1
|
9
|
+
post_install_message:
|
10
|
+
date: 2009-11-04 23:00:00 +00:00
|
24
11
|
files:
|
25
12
|
- lib/semantic_naming.rb
|
26
13
|
- lib/semantic_naming/default_namespaces.rb
|
@@ -29,36 +16,49 @@ files:
|
|
29
16
|
- lib/semantic_naming/source_class.rb
|
30
17
|
- lib/semantic_naming/uri.rb
|
31
18
|
- README.rdoc
|
19
|
+
rubygems_version: 1.3.5
|
20
|
+
rdoc_options:
|
21
|
+
- --charset=UTF-8
|
22
|
+
signing_key:
|
23
|
+
cert_chain: []
|
24
|
+
|
25
|
+
name: semantic_naming
|
32
26
|
has_rdoc: true
|
33
|
-
|
27
|
+
platform: ruby
|
28
|
+
summary: Semantic Naming Extensions for ActiveRDF, Talia and others
|
29
|
+
default_executable:
|
30
|
+
bindir: bin
|
34
31
|
licenses: []
|
35
32
|
|
36
|
-
|
37
|
-
|
38
|
-
- --charset=UTF-8
|
39
|
-
require_paths:
|
40
|
-
- lib
|
41
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
33
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
34
|
+
version:
|
42
35
|
requirements:
|
43
|
-
- -
|
36
|
+
- - '>='
|
44
37
|
- !ruby/object:Gem::Version
|
45
38
|
version: "0"
|
39
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
46
40
|
version:
|
47
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
41
|
requirements:
|
49
|
-
- -
|
42
|
+
- - '>='
|
50
43
|
- !ruby/object:Gem::Version
|
51
44
|
version: "0"
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
rubyforge_project:
|
56
|
-
rubygems_version: 1.3.5
|
57
|
-
signing_key:
|
45
|
+
require_paths:
|
46
|
+
- lib
|
58
47
|
specification_version: 3
|
59
|
-
summary: Semantic Naming Extensions for ActiveRDF, Talia and others
|
60
48
|
test_files:
|
61
49
|
- test/namespace_test.rb
|
62
50
|
- test/predicate_test.rb
|
63
51
|
- test/source_class_test.rb
|
64
52
|
- test/uri_test.rb
|
53
|
+
dependencies: []
|
54
|
+
|
55
|
+
description:
|
56
|
+
email: hahn@netseven.it
|
57
|
+
authors:
|
58
|
+
- Daniel Hahn
|
59
|
+
extra_rdoc_files:
|
60
|
+
- README.rdoc
|
61
|
+
requirements: []
|
62
|
+
|
63
|
+
rubyforge_project:
|
64
|
+
autorequire:
|