ontology-united 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +154 -0
- data/lib/ontology-united/dsl/ontology.rb +17 -5
- data/lib/ontology-united/dsl/ontology_dsl.rb +4 -0
- data/lib/ontology-united/serializer/owl/manchester.rb +3 -3
- data/lib/ontology-united/serializer/serializer_base.rb +22 -11
- data/lib/ontology-united/version.rb +1 -1
- data/spec/ontology-united/ontology-united_spec.rb +2 -2
- data/spec/ontology-united/serializer/owl/manchester_spec.rb +30 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ab561ca8455f27d70cbdd4cb9c20351da04f6a4e
|
4
|
+
data.tar.gz: ff6f3bb6c32f3cb2b9fd3862e10cc2b140ab9269
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 758a5eac126d84d58d6a46901b43299ec9040e7b4f4f1166c3c2e8e6333cbb389caef40a7ce4e017c065ba71eef119a8dc62877c967e49c441901844f9d03aec
|
7
|
+
data.tar.gz: 6890fcda4eccbfc2b0d89aac0b8448e94bcd040d3fbdf0faa70c5fccb462b739e4749395a0a36d10c8975088c403f87a588f4368e515ef473d09c0a20ff32090
|
data/README.md
CHANGED
@@ -31,3 +31,157 @@ Or install it yourself as:
|
|
31
31
|
|
32
32
|
$ gem install ontology-united
|
33
33
|
|
34
|
+
## Usage
|
35
|
+
|
36
|
+
First you'll need to require the gem (unless you are using bundler):
|
37
|
+
```ruby
|
38
|
+
require 'ontology-united'
|
39
|
+
```
|
40
|
+
|
41
|
+
After doing this you'll be able to create an ontology in two different ways.
|
42
|
+
Either by explicitly using the defined method:
|
43
|
+
```ruby
|
44
|
+
OntologyUnited::DSL::OntologyDSL.define('MyOntologyName') do
|
45
|
+
end
|
46
|
+
```
|
47
|
+
|
48
|
+
or by including the convience module, which will give you a more
|
49
|
+
useful/shorter method call:
|
50
|
+
```ruby
|
51
|
+
# you'll only need to do this once per namespace
|
52
|
+
include OntologyUnited::Convience
|
53
|
+
|
54
|
+
define_ontology('MyOntologyName') do
|
55
|
+
end
|
56
|
+
```
|
57
|
+
|
58
|
+
### Building your ontology
|
59
|
+
|
60
|
+
Usually there is more than one way to building your ontology, i will
|
61
|
+
elaborate on the benefits and drawbacks of each method. However i will now
|
62
|
+
use the convenience method of building an ontology.
|
63
|
+
|
64
|
+
#### Prefix
|
65
|
+
|
66
|
+
In order to benefit from ontology-united you'll first need to create a
|
67
|
+
prefix. As the block passed to `define_ontology` is `instance_eval`ed on the
|
68
|
+
ontology, self will be the current ontology. So you can create a prefix
|
69
|
+
which points to the current ontology.
|
70
|
+
```ruby
|
71
|
+
define_ontology('MyOntologyName') do
|
72
|
+
this = prefix('thisOntology', self)
|
73
|
+
end
|
74
|
+
```
|
75
|
+
|
76
|
+
However technically you can also pass an IRI (internationalized resource
|
77
|
+
identifier) instead of `self`. But then you're pretty much on your own.
|
78
|
+
You'll need to handle iri-management yourself.
|
79
|
+
```ruby
|
80
|
+
# Handling iri-management yourself:
|
81
|
+
define_ontology('MyOntologyName') do
|
82
|
+
this = prefix('thisOntology', 'http://example.com/MyOntologyName#')
|
83
|
+
end
|
84
|
+
```
|
85
|
+
|
86
|
+
#### Class (OWL)
|
87
|
+
|
88
|
+
```ruby
|
89
|
+
define_ontology('MyOntologyName') do
|
90
|
+
this = prefix('thisOntology', self)
|
91
|
+
this.class('ASampleClass')
|
92
|
+
end
|
93
|
+
```
|
94
|
+
|
95
|
+
The `.class` method on a prefix, will create a prefixed class inside of the
|
96
|
+
current ontology. If you do not want to rely on prefixes you can also use
|
97
|
+
`ontology_class()` but then the argument has to be an IRI instead of a name.
|
98
|
+
And again (as with prefixes) your currently on your own for
|
99
|
+
iri-management.
|
100
|
+
|
101
|
+
|
102
|
+
```ruby
|
103
|
+
# Handling iri-management yourself:
|
104
|
+
define_ontology('MyOntologyName') do
|
105
|
+
ontology_class('http://example.com/MyOntology#ASampleClass')
|
106
|
+
end
|
107
|
+
```
|
108
|
+
|
109
|
+
By the way, you do not need to store ontology classes inside variables in
|
110
|
+
order to use them again (i.e. in sentences). You can just *define* them
|
111
|
+
again. The system will figure out by itself, that you actually meant the
|
112
|
+
same class.
|
113
|
+
|
114
|
+
#### Sentence
|
115
|
+
|
116
|
+
Currently ontology-united only supports `sub_class_of` sentences. This will
|
117
|
+
be extended in the future, but it *has* to be enough for now.
|
118
|
+
|
119
|
+
```ruby
|
120
|
+
define_ontology('MyOntologyName') do
|
121
|
+
this = prefix('thisOntology', self)
|
122
|
+
this.class('ASampleClass').sub_class_of this.class('AParentClass')
|
123
|
+
end
|
124
|
+
```
|
125
|
+
|
126
|
+
#### Imports
|
127
|
+
|
128
|
+
You can define ontologies inside of other ontologies, through the inner
|
129
|
+
`define`-method, which works exactly as the standard `define` method (also
|
130
|
+
called `define_ontology` in convenience mode).
|
131
|
+
|
132
|
+
```ruby
|
133
|
+
define_ontology('Foo') do
|
134
|
+
this = prefix('this', self)
|
135
|
+
define('Bar') do
|
136
|
+
rr = prefix('rr', self)
|
137
|
+
rr.class('SomeBar')
|
138
|
+
end
|
139
|
+
this.class('Bar').sub_class_of this.class('Foo')
|
140
|
+
this.class('something')
|
141
|
+
this.class('something').sub_class_of this.class('Foo')
|
142
|
+
end
|
143
|
+
```
|
144
|
+
|
145
|
+
As you might've guessed this is pretty useful when using imports, as this
|
146
|
+
would allow you to import an ontology which you just defined *in-place*.
|
147
|
+
Let's take a look at this:
|
148
|
+
|
149
|
+
```ruby
|
150
|
+
define_ontology('Foo') do
|
151
|
+
import define('Bar') do
|
152
|
+
rr = prefix('rr', self)
|
153
|
+
rr.class('SomeBar')
|
154
|
+
end
|
155
|
+
this.class('Bar').sub_class_of this.class('Foo')
|
156
|
+
end
|
157
|
+
```
|
158
|
+
|
159
|
+
The `import` method is key, and that is basically it.
|
160
|
+
|
161
|
+
|
162
|
+
### Serialization
|
163
|
+
|
164
|
+
Let's assume we have an ontology:
|
165
|
+
|
166
|
+
```ruby
|
167
|
+
ontology = define_ontology('Foo') do
|
168
|
+
rr = prefix('rr', self)
|
169
|
+
imports define('Bar') do
|
170
|
+
rr = prefix('rr', self)
|
171
|
+
rr.class('SomeBar')
|
172
|
+
end
|
173
|
+
rr.class('Bar').sub_class_of rr.class('Foo')
|
174
|
+
rr.class('something')
|
175
|
+
rr.class('something').sub_class_of rr.class('Foo')
|
176
|
+
end
|
177
|
+
```
|
178
|
+
|
179
|
+
If we want to work with it, we can query it for its IRI like this:
|
180
|
+
`ontology.iri`, which will return a `file://`-schema IRI.
|
181
|
+
|
182
|
+
If we want access to the `Tempfile` (which ontology-united uses internally),
|
183
|
+
we can call `ontology.file`.
|
184
|
+
|
185
|
+
Both methods will ensure that the corresponding file is created and
|
186
|
+
serialized, including all imported ontologies.
|
187
|
+
|
@@ -4,6 +4,7 @@ require 'set'
|
|
4
4
|
module OntologyUnited
|
5
5
|
module DSL
|
6
6
|
class Ontology < BaseDSL
|
7
|
+
DEFAULT_EXTENSION = :owl
|
7
8
|
|
8
9
|
attr_reader_with_default :the_classes, :the_imports,
|
9
10
|
:the_sentences, :the_prefixes, default: Set
|
@@ -39,10 +40,14 @@ module OntologyUnited
|
|
39
40
|
OntologyDSL.define(*args, &block)
|
40
41
|
end
|
41
42
|
|
43
|
+
def redefine(ontology = self, &block)
|
44
|
+
OntologyDSL.redefine(ontology, &block)
|
45
|
+
end
|
46
|
+
|
42
47
|
def imports(arg, &block)
|
43
|
-
if block
|
48
|
+
if block && arg.is_a?(Ontology)
|
44
49
|
ontology = arg
|
45
|
-
arg =
|
50
|
+
arg = redefine(&block)
|
46
51
|
end
|
47
52
|
the_import = OntologyImport.new(arg)
|
48
53
|
the_imports << the_import
|
@@ -71,14 +76,21 @@ module OntologyUnited
|
|
71
76
|
end
|
72
77
|
|
73
78
|
def file
|
74
|
-
@file
|
79
|
+
create_tempfile if @file.nil?
|
80
|
+
@file
|
81
|
+
end
|
82
|
+
|
83
|
+
def extension
|
84
|
+
".#{DEFAULT_EXTENSION}"
|
75
85
|
end
|
76
86
|
|
77
87
|
def create_tempfile
|
78
|
-
filename = name
|
79
|
-
file = Tempfile.new([filename,
|
88
|
+
filename = name
|
89
|
+
file = Tempfile.new([filename, extension])
|
80
90
|
@iri = "file://#{file.path}"
|
91
|
+
@file = file
|
81
92
|
file.write(self.to_s)
|
93
|
+
file.flush
|
82
94
|
file.rewind
|
83
95
|
file
|
84
96
|
end
|
@@ -46,11 +46,11 @@ module OntologyUnited::Serializer
|
|
46
46
|
|
47
47
|
def class_definition?(ontology_class)
|
48
48
|
# if no parent is set
|
49
|
-
|
49
|
+
parent.nil? ||
|
50
50
|
# or the parent is an ontology itself
|
51
|
-
ontology?(
|
51
|
+
ontology?(parent) ||
|
52
52
|
# or it is the first symbol of a sentence
|
53
|
-
sentence?(
|
53
|
+
sentence?(parent) && parent.sentence.first == ontology_class
|
54
54
|
end
|
55
55
|
|
56
56
|
end
|
@@ -1,25 +1,36 @@
|
|
1
1
|
module OntologyUnited
|
2
2
|
module Serializer
|
3
3
|
class SerializerBase
|
4
|
-
attr_accessor :current, :parent_current
|
5
4
|
|
6
5
|
def initialize(current: nil)
|
7
|
-
|
8
|
-
self.parent_current = nil
|
6
|
+
stack.push(current) if current
|
9
7
|
end
|
10
8
|
|
11
9
|
def process(subject, &block)
|
12
|
-
|
10
|
+
mark!(subject)
|
13
11
|
result = block.call
|
14
|
-
|
12
|
+
unmark!
|
15
13
|
result
|
16
14
|
end
|
17
15
|
|
18
|
-
def mark!(subject
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
16
|
+
def mark!(subject)
|
17
|
+
stack.push(subject)
|
18
|
+
end
|
19
|
+
|
20
|
+
def unmark!
|
21
|
+
stack.pop
|
22
|
+
end
|
23
|
+
|
24
|
+
def stack
|
25
|
+
@stack ||= []
|
26
|
+
end
|
27
|
+
|
28
|
+
def current
|
29
|
+
stack[-1]
|
30
|
+
end
|
31
|
+
|
32
|
+
def parent
|
33
|
+
stack[-2]
|
23
34
|
end
|
24
35
|
|
25
36
|
def join(elements, sep)
|
@@ -38,7 +49,7 @@ module OntologyUnited
|
|
38
49
|
subject.is_a?(OntologyUnited::DSL::OntologyClass)
|
39
50
|
end
|
40
51
|
|
41
|
-
def
|
52
|
+
def sentence?(subject)
|
42
53
|
subject.is_a?(OntologyUnited::DSL::OntologySentence)
|
43
54
|
end
|
44
55
|
|
@@ -9,9 +9,9 @@ describe OntologyUnited do
|
|
9
9
|
|
10
10
|
context 'when issueing a standard definition' do
|
11
11
|
let(:ontology) do
|
12
|
-
OntologyUnited::DSL::OntologyDSL.define('Foo
|
12
|
+
OntologyUnited::DSL::OntologyDSL.define('Foo') do
|
13
13
|
rr = prefix('rr', self)
|
14
|
-
imports define('Bar
|
14
|
+
imports define('Bar') do
|
15
15
|
rr = prefix('rr', self)
|
16
16
|
rr.class('SomeBar')
|
17
17
|
end
|
@@ -5,7 +5,7 @@ describe OntologyUnited::Serializer::OWL::Manchester do
|
|
5
5
|
let(:name) { 'OntologyName' }
|
6
6
|
let(:list) do
|
7
7
|
the_prefix, ontology_class, sentence = nil
|
8
|
-
o = OntologyUnited::DSL::OntologyDSL.define(
|
8
|
+
o = OntologyUnited::DSL::OntologyDSL.define(name) do
|
9
9
|
the_prefix = prefix('some', self)
|
10
10
|
ontology_class = the_prefix.class('Foobar')
|
11
11
|
sentence = ontology_class.sub_class_of the_prefix.class('NoBar')
|
@@ -53,8 +53,36 @@ describe OntologyUnited::Serializer::OWL::Manchester do
|
|
53
53
|
let(:serialized) { sentence.to_s(serializer: manchester.new) }
|
54
54
|
|
55
55
|
it 'should be a valid manchester syntax sentence definition' do
|
56
|
-
expect(serialized).to eq("Class: some:Foobar SubClassOf:
|
56
|
+
expect(serialized).to eq("Class: some:Foobar SubClassOf: some:NoBar")
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
+
context 'when serializing ontologies with imports' do
|
61
|
+
let(:manchester) { OntologyUnited::Serializer::OWL::Manchester }
|
62
|
+
let(:name) { 'OntologyName' }
|
63
|
+
let(:list) do
|
64
|
+
referenced, the_import = nil
|
65
|
+
o = OntologyUnited::DSL::OntologyDSL.define(name) do
|
66
|
+
referenced = define('OtherOne') do
|
67
|
+
ontohub = prefix('ontohub', self)
|
68
|
+
ontohub.class('some_class')
|
69
|
+
end
|
70
|
+
the_import = imports referenced
|
71
|
+
end
|
72
|
+
[o, referenced, the_import]
|
73
|
+
end
|
74
|
+
let(:ontology) { list[0] }
|
75
|
+
let(:referenced) { list[1] }
|
76
|
+
let(:import) { list[2] }
|
77
|
+
|
78
|
+
context 'when serializing an import' do
|
79
|
+
let!(:serialized) { import.to_s(serializer: manchester.new) }
|
80
|
+
|
81
|
+
it 'should be a valid manchester syntax import definition' do
|
82
|
+
expect(serialized).to eq("Import: <#{referenced.iri}>")
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
|
60
88
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ontology-united
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Reddehase
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|