yowl 0.4.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/CHANGES +15 -0
  2. data/INSTALL-MACOSX.md +107 -0
  3. data/README.md +92 -0
  4. data/Rakefile +76 -0
  5. data/bin/yowl +14 -0
  6. data/examples/introduction.html +5 -0
  7. data/lib/yowl/association.rb +66 -0
  8. data/lib/yowl/class.rb +296 -0
  9. data/lib/yowl/generator.rb +96 -0
  10. data/lib/yowl/import.rb +62 -0
  11. data/lib/yowl/individual.rb +398 -0
  12. data/lib/yowl/individual_association.rb +80 -0
  13. data/lib/yowl/ontology.rb +197 -0
  14. data/lib/yowl/options.rb +116 -0
  15. data/lib/yowl/optionsparser.rb +75 -0
  16. data/lib/yowl/person.rb +26 -0
  17. data/lib/yowl/property.rb +190 -0
  18. data/lib/yowl/repository.rb +100 -0
  19. data/lib/yowl/schema.rb +519 -0
  20. data/lib/yowl/template/css/jquery.ui.all.css +11 -0
  21. data/lib/yowl/template/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  22. data/lib/yowl/template/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  23. data/lib/yowl/template/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  24. data/lib/yowl/template/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  25. data/lib/yowl/template/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  26. data/lib/yowl/template/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  27. data/lib/yowl/template/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  28. data/lib/yowl/template/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  29. data/lib/yowl/template/css/smoothness/images/ui-icons_222222_256x240.png +0 -0
  30. data/lib/yowl/template/css/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  31. data/lib/yowl/template/css/smoothness/images/ui-icons_454545_256x240.png +0 -0
  32. data/lib/yowl/template/css/smoothness/images/ui-icons_888888_256x240.png +0 -0
  33. data/lib/yowl/template/css/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  34. data/lib/yowl/template/css/smoothness/jquery-ui-1.8.23.custom.css +563 -0
  35. data/lib/yowl/template/css/yowl.css +414 -0
  36. data/lib/yowl/template/import-diagram.erb +29 -0
  37. data/lib/yowl/template/index.erb +56 -0
  38. data/lib/yowl/template/js/jquery-1.7.2.min.js +4 -0
  39. data/lib/yowl/template/js/jquery-ui-1.8.23.custom.min.js +125 -0
  40. data/lib/yowl/template/js/jquery.ui.accordion.js +611 -0
  41. data/lib/yowl/template/js/yowl.js +72 -0
  42. data/lib/yowl/template/ontology.erb +598 -0
  43. data/lib/yowl/template/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  44. data/lib/yowl/template/themes/base/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  45. data/lib/yowl/template/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  46. data/lib/yowl/template/themes/base/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  47. data/lib/yowl/template/themes/base/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  48. data/lib/yowl/template/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  49. data/lib/yowl/template/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  50. data/lib/yowl/template/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  51. data/lib/yowl/template/themes/base/images/ui-icons_222222_256x240.png +0 -0
  52. data/lib/yowl/template/themes/base/images/ui-icons_2e83ff_256x240.png +0 -0
  53. data/lib/yowl/template/themes/base/images/ui-icons_454545_256x240.png +0 -0
  54. data/lib/yowl/template/themes/base/images/ui-icons_888888_256x240.png +0 -0
  55. data/lib/yowl/template/themes/base/images/ui-icons_cd0a0a_256x240.png +0 -0
  56. data/lib/yowl/template/themes/base/jquery.ui.accordion.css +19 -0
  57. data/lib/yowl/template/themes/base/jquery.ui.all.css +11 -0
  58. data/lib/yowl/template/themes/base/jquery.ui.autocomplete.css +53 -0
  59. data/lib/yowl/template/themes/base/jquery.ui.base.css +11 -0
  60. data/lib/yowl/template/themes/base/jquery.ui.button.css +38 -0
  61. data/lib/yowl/template/themes/base/jquery.ui.core.css +38 -0
  62. data/lib/yowl/template/themes/base/jquery.ui.datepicker.css +66 -0
  63. data/lib/yowl/template/themes/base/jquery.ui.dialog.css +21 -0
  64. data/lib/yowl/template/themes/base/jquery.ui.progressbar.css +11 -0
  65. data/lib/yowl/template/themes/base/jquery.ui.resizable.css +20 -0
  66. data/lib/yowl/template/themes/base/jquery.ui.selectable.css +10 -0
  67. data/lib/yowl/template/themes/base/jquery.ui.slider.css +24 -0
  68. data/lib/yowl/template/themes/base/jquery.ui.tabs.css +18 -0
  69. data/lib/yowl/template/themes/base/jquery.ui.theme.css +247 -0
  70. data/lib/yowl/template/themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  71. data/lib/yowl/template/themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  72. data/lib/yowl/template/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  73. data/lib/yowl/template/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  74. data/lib/yowl/template/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  75. data/lib/yowl/template/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  76. data/lib/yowl/template/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  77. data/lib/yowl/template/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  78. data/lib/yowl/template/themes/smoothness/images/ui-icons_222222_256x240.png +0 -0
  79. data/lib/yowl/template/themes/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  80. data/lib/yowl/template/themes/smoothness/images/ui-icons_454545_256x240.png +0 -0
  81. data/lib/yowl/template/themes/smoothness/images/ui-icons_888888_256x240.png +0 -0
  82. data/lib/yowl/template/themes/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  83. data/lib/yowl/template/themes/smoothness/jquery-ui-1.8.23.custom.css +563 -0
  84. data/lib/yowl/template/themes/smoothness/jquery.ui.accordion.css +19 -0
  85. data/lib/yowl/template/themes/smoothness/jquery.ui.all.css +11 -0
  86. data/lib/yowl/template/themes/smoothness/jquery.ui.autocomplete.css +53 -0
  87. data/lib/yowl/template/themes/smoothness/jquery.ui.base.css +11 -0
  88. data/lib/yowl/template/themes/smoothness/jquery.ui.button.css +38 -0
  89. data/lib/yowl/template/themes/smoothness/jquery.ui.core.css +38 -0
  90. data/lib/yowl/template/themes/smoothness/jquery.ui.datepicker.css +66 -0
  91. data/lib/yowl/template/themes/smoothness/jquery.ui.dialog.css +21 -0
  92. data/lib/yowl/template/themes/smoothness/jquery.ui.progressbar.css +11 -0
  93. data/lib/yowl/template/themes/smoothness/jquery.ui.resizable.css +20 -0
  94. data/lib/yowl/template/themes/smoothness/jquery.ui.selectable.css +10 -0
  95. data/lib/yowl/template/themes/smoothness/jquery.ui.slider.css +24 -0
  96. data/lib/yowl/template/themes/smoothness/jquery.ui.tabs.css +18 -0
  97. data/lib/yowl/template/themes/smoothness/jquery.ui.theme.css +249 -0
  98. data/lib/yowl/util.rb +221 -0
  99. data/lib/yowl/version.rb +3 -0
  100. data/lib/yowl.rb +42 -0
  101. data/test/input/base-with-comments.ttl +163 -0
  102. data/test/input/base.ttl +221 -0
  103. data/test/input/empty.ttl +8 -0
  104. data/test/input/example.ttl +73 -0
  105. data/test/test_example_ttl.rb +62 -0
  106. data/test/test_yowl.rb +4 -0
  107. data/test/testcases.md +24 -0
  108. metadata +311 -0
data/CHANGES ADDED
@@ -0,0 +1,15 @@
1
+
2
+ 0.4
3
+
4
+ - Rename to YOWL
5
+
6
+ 0.3
7
+
8
+ - Now also finds dowl/introduction.html
9
+ - When rdfs:label is missing the short name is used
10
+ - Generates SVG graphics:
11
+ - a Class Diagram with all Classes found in a schema
12
+ - A Diagram per Class with its direct associations
13
+ - A Diagram per Individual with its direct associations
14
+ - At the index page: a Diagram with all Ontologies and their import relationships
15
+
data/INSTALL-MACOSX.md ADDED
@@ -0,0 +1,107 @@
1
+ # Installation on Mac OS X
2
+
3
+ Unfortunately, its not trivial to get YOWL to run on Mac OS X.
4
+
5
+ You can either use MacPorts or Brew to install some of the components that YOWL needs.
6
+
7
+ ## MacPorts
8
+
9
+ You first have to download and install MacPorts: http://www.macports.org/install.php
10
+
11
+ Then use MacPorts to install GraphViz (which is used to generate the graphics) and wget:
12
+
13
+ ```
14
+ sudo port install graphviz wget
15
+ ```
16
+
17
+ ## HomeBrew
18
+
19
+ As an alternative to MacPorts, you can install Brew and use that to install Graphviz,
20
+ for installation instructions of Brew look here: https://github.com/mxcl/homebrew/wiki/Installation
21
+
22
+ Once Brew is installed, install Graphviz and wget:
23
+
24
+ ```
25
+ sudo brew install graphviz wget
26
+ ```
27
+
28
+ ## Raptor 1
29
+
30
+ YOWL depends on the Ruby package "ruby-rdf" which in turn depends on a C library called "raptor".
31
+ Unfortunately, MacPorts recently dropped support for the older version of Raptor (version 1) that
32
+ is used by ruby-rdf, so MacPorts can only install version 2, which is not compatible with ruby-rdf,
33
+ so don't bother to install it.
34
+ Another well known package manager for Mac OS X, HomeBrew, also can only install version 2
35
+ of libraptor.
36
+
37
+ There are two solutions available at this point (unless you have a better idea):
38
+
39
+ ### Building libraptor version 1 from source
40
+
41
+ ```
42
+ mkdir -p ~/Work/build
43
+ cd ~/Work/build
44
+ wget http://download.librdf.org/source/raptor-1.4.21.tar.gz
45
+ tar xvf raptor-1.4.21.tar.gz
46
+ cd raptor-1.4.21
47
+ ./configure "CPPFLAGS=-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/usr/include"
48
+ make
49
+ sudo make install
50
+ ```
51
+
52
+ As you can see in the configure line above, the build procedure assumes that you have Xcode installed, where it tries to find "curl/types.h".
53
+ If you have this file installed elsewhere then change that location on the configure line.
54
+ One way to find "curl/types.h" is:
55
+
56
+ ```
57
+ sudo locate types.h | grep curl
58
+ ```
59
+
60
+ Or
61
+
62
+ ```
63
+ sudo find /usr /opt /sw /Applications -name 'types.h' | grep curl
64
+ ```
65
+
66
+ ### Installing libraptor version 1 with Fink
67
+
68
+ Besides MacPorts and HomeBrew, there's also Fink. Go to the Fink website, download
69
+ and install Fink and then type:
70
+
71
+ ```
72
+ sudo fink selfupdate
73
+ sudo fink install raptor-bin
74
+ ```
75
+
76
+ This will fail on Mac OS X Mountain Lion (10.8.x or later) because the raptor package
77
+ as defined by Fink is dependent on an older version of curl, which does no longer have
78
+ the "curl/types.h" file, which is needed by raptor, unless you configure it a bit
79
+ differently:
80
+
81
+ Open the Fink package file for raptor:
82
+
83
+ ```
84
+ sudo vi /sw/fink/10.7/stable/main/finkinfo/libs/libraptor1-shlibs.info
85
+ ```
86
+
87
+ Find the line that starts with "ConfigureParams:" and add the option --with-www=xml so
88
+ that it looks as follows:
89
+ ```
90
+ ConfigureParams: --enable-dependency-tracking --disable-static --enable-gtk-doc --with-www=xml
91
+ ```
92
+
93
+ Then save the file and execute the following:
94
+
95
+ ```
96
+ sudo fink rebuildpackage raptor-bin
97
+ sudo fink install raptor-bin
98
+ sudo ln -s /sw/lib/libraptor.1.dylib /usr/lib/libraptor.dylib
99
+ ```
100
+
101
+ ## Gems
102
+
103
+ YOWL depends on various "ruby gems" that can be installed as follows:
104
+
105
+ ```
106
+ sudo gem install ffi rdf rdf-raptor rdf-json rdf-trix sxp sparql ruby-graphviz
107
+ ```
data/README.md ADDED
@@ -0,0 +1,92 @@
1
+ # YOWL
2
+
3
+ Yet another OWL documentor. YOWL is a command line utility that can read a number of
4
+ RDFS/OWL files, called the repository, and generate a documentation website from it,
5
+ with visualisations like Class Diagrams (as SVG), Individuals Diagrams and Import Diagrams.
6
+
7
+ It also detects annotations from the following public ontologies:
8
+
9
+ - Dublin Core
10
+ - [Term-centric Semantic Web Vocabulary Annotations](http://www.w3.org/2003/06/sw-vocab-status/note)
11
+ - [VANN](http://vocab.org/vann/.html)
12
+ - SKOS
13
+ - FOAF
14
+
15
+ This is a fork of the original DOWL project at https://github.com/ldodds/dowl.
16
+
17
+ # INSTALLATION
18
+
19
+ ## Installation on Mac OS X:
20
+
21
+ [Installation on Mac OS X](/jgeluk/yowl/blob/master/INSTALL-MACOSX.md)
22
+
23
+ ## Installation on Ubuntu
24
+
25
+ ```bash
26
+ apt-get install ruby rake gem
27
+ ```
28
+
29
+ ## General
30
+
31
+ Install all libraries used by YOWL:
32
+
33
+ ```bash
34
+ [sudo] gem install ffi rdf rdf-raptor rdf-json rdf-trix sxp sparql ruby-graphviz
35
+ ```
36
+
37
+ This version of YOWL is not yet available as a "gem" itself so it needs to be downloaded from Github:
38
+
39
+ ```bash
40
+ mkdir ~/downloads
41
+ cd ~/downloads
42
+ wget http://github.com/jgeluk/yowl/tarball/master -O yowl.tar.gz
43
+ tar xvf yowl.tar.gz
44
+ #
45
+ # Remember the name of the root directory of the unpacked tarball
46
+ # which looks like jgeluk-yowl-5ba77f5
47
+ #
48
+ sudo rm -rf /opt/yowl
49
+ sudo mv ~/downloads/jgeluk-yowl-5ba77f5 /opt/yowl
50
+ cd /opt/yowl
51
+ sudo rake install
52
+ ```
53
+
54
+ Or get it with git:
55
+
56
+ ```bash
57
+ rm -rf /opt/yowl
58
+ cd /opt
59
+ git clone git@github.com:jgeluk/yowl.git
60
+ cd /opt/yowl
61
+ sudo rake install
62
+ ```
63
+
64
+ # Usage
65
+
66
+ Execute bin/yowl to see usage options:
67
+
68
+ ```bash
69
+ user@host:/opt/yowl# /opt/yowl/bin/yowl
70
+ Output will be generated in this directory: /opt/yowl
71
+ Usage: YOWL [<options>]
72
+
73
+ Specific options:
74
+ -i, --ontology FILES Read input FILES
75
+ -o, --output DIR Write HTML output to DIR
76
+ -t, --template DIR Use ERB templates in DIR
77
+ --no-vann Skip looking for vann:preferedNamespacePrefix
78
+
79
+ Common options:
80
+ -?, -h, --help Show this message
81
+ -V, --version Show version
82
+ -v, --verbose Show verbose logging
83
+ ```
84
+
85
+ For example, to generate a site for the PROV ontology,
86
+ download the prov owl file and run YOWL as follows:
87
+
88
+ ```bash
89
+ /opt/yowl/bin/yowl -i /root/downloads/prov/*.owl -o /var/www/prov
90
+ ```
91
+
92
+
data/Rakefile ADDED
@@ -0,0 +1,76 @@
1
+ require 'rake'
2
+ require 'rubygems'
3
+ require 'rubygems/package_task'
4
+ require 'rdoc/task'
5
+ require 'rake/testtask'
6
+ require 'rake/clean'
7
+
8
+ NAME = "yowl"
9
+ VER = "0.4.pre"
10
+
11
+ RDOC_OPTS = ['--quiet', '--title', 'yowl reference', '--main', 'README.md']
12
+
13
+ PKG_FILES = %w(README.md INSTALL-MACOSX.md Rakefile CHANGES) +
14
+ Dir.glob("{bin,test,examples,lib}/**/*")
15
+
16
+ CLEAN.include ['*.gem', 'pkg']
17
+
18
+ SPEC = Gem::Specification.new do |s|
19
+ s.platform = Gem::Platform::RUBY
20
+ s.summary = 'OWL visualization and documentation generator'
21
+ s.description = <<-EOF
22
+ Yet another OWL documentor. YOWL is a command line utility that can read a number of RDFS/OWL files,
23
+ called the repository, and generate a documentation website from it, with visualisations like
24
+ Class Diagrams (as SVG), Individuals Diagrams and Import Diagrams.
25
+ EOF
26
+ s.name = NAME
27
+ s.version = VER
28
+ s.required_ruby_version = ">= 1.8.7"
29
+ s.has_rdoc = true
30
+ s.extra_rdoc_files = ["README.md", "INSTALL-MACOSX.md", "CHANGES"]
31
+ s.rdoc_options = RDOC_OPTS
32
+ s.authors = ['Leigh Dodds', 'Jacobus Geluk']
33
+ s.email = ['leigh.dodds@talis.com', 'jacobus.geluk@gmail.com']
34
+ s.homepage = 'http://github.com/jgeluk/yowl'
35
+ s.files = PKG_FILES
36
+ s.require_path = "lib"
37
+ s.bindir = "bin"
38
+ s.executables = ["yowl"]
39
+ s.test_file = "test/test_yowl.rb"
40
+ s.add_dependency("rdf-raptor", ">= 0.4.0")
41
+ s.add_dependency("ffi", ">= 1.1.5")
42
+ s.add_dependency("rdf", ">= 0.3.8")
43
+ s.add_dependency("rdf-raptor", ">= 0.4.2")
44
+ s.add_dependency("rdf-json", ">= 0.3.0")
45
+ s.add_dependency("rdf-trix", ">= 0.3.0")
46
+ s.add_dependency("sxp", ">= 0.0.14")
47
+ s.add_dependency("sparql", ">= 0.3.1")
48
+ s.add_dependency("ruby-graphviz", ">= 1.0.8")
49
+ s.rubyforge_project = 'nowarning'
50
+ end
51
+
52
+ Gem::PackageTask.new(SPEC) do |pkg|
53
+ pkg.need_tar = true
54
+ end
55
+
56
+ RDoc::Task.new do |rdoc|
57
+ rdoc.rdoc_dir = 'doc/rdoc'
58
+ rdoc.options += RDOC_OPTS
59
+ rdoc.rdoc_files.include("README.md", "INSTALL-MACOSX.md", "CHANGES", "lib/**/*.rb")
60
+ rdoc.main = "README.md"
61
+ end
62
+
63
+ Rake::TestTask.new do |test|
64
+ test.verbose = true
65
+ end
66
+
67
+ desc "Install from a locally built copy of the gem"
68
+ task :install do
69
+ sh %{rake package}
70
+ sh %{sudo gem install pkg/#{NAME}-#{VER}}
71
+ end
72
+
73
+ desc "Uninstall the gem"
74
+ task :uninstall => [:clean] do
75
+ sh %{sudo gem uninstall #{NAME}}
76
+ end
data/bin/yowl ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
3
+ require 'rubygems'
4
+ require 'getoptlong'
5
+ require 'yowl'
6
+ require 'erb'
7
+
8
+ PROGRAM = File::basename $0
9
+
10
+ options = YOWL::OptionsParser.parse(ARGV)
11
+ if options
12
+ repository = YOWL::Repository.new(options)
13
+ YOWL::Generator.new(repository, options).run()
14
+ end
@@ -0,0 +1,5 @@
1
+ <h2>Introduction</h2>
2
+
3
+ <p>
4
+ Contents of introduction.html in the same directory is automatically included.
5
+ </p>
@@ -0,0 +1,66 @@
1
+ module YOWL
2
+ class Association < YOWL::LabelledDocObject
3
+
4
+ attr_reader :domainClass
5
+ attr_reader :rangeClass
6
+ attr_reader :property
7
+ attr_reader :key
8
+ def initialize(resource, schema, domainClass, rangeClass)
9
+ super(resource, schema)
10
+ @domainClass = domainClass
11
+ @rangeClass = rangeClass
12
+
13
+ @key = "#{@domainClass.uri},#{@rangeClass.uri},#{label}".hash
14
+ end
15
+
16
+ def label
17
+ return short_name
18
+ end
19
+
20
+ def hash
21
+ return key
22
+ end
23
+
24
+ def eql?(other)
25
+ @key.eql? other.key
26
+ end
27
+
28
+ #
29
+ # Add the current Association as an edge to the given GraphViz graph,
30
+ # but check whether the Association refers to a Domain and Range class in
31
+ # the current schema and whether the Association has already been added
32
+ # to the graph (by checking the given edges collection).
33
+ #
34
+ def addAsGraphVizEdge(graph_, nodes_, edges_)
35
+
36
+ if not nodes_.has_key?(@domainClass.uri)
37
+ return nodes_, edges_
38
+ end
39
+ if not nodes_.has_key?(@rangeClass.uri)
40
+ return nodes_, edges_
41
+ end
42
+ if edges_.has_key?(@key)
43
+ return nodes_, edges_
44
+ end
45
+
46
+ domainClassNode = nodes_[@domainClass.uri]
47
+ rangeClassNode = nodes_[@rangeClass.uri]
48
+
49
+ edges_[@key] = Association.newGraphVizEdge(graph_, domainClassNode, rangeClassNode, label)
50
+
51
+ return nodes_, edges_
52
+ end
53
+
54
+ def Association.newGraphVizEdge(graph_, domainNode_, rangeNode_, label_, constraint_ = true)
55
+ return graph_.add_edges(
56
+ domainNode_,
57
+ rangeNode_,
58
+ :label => label_,
59
+ :arrowhead => :open,
60
+ :arrowsize => 0.5,
61
+ :penwidth => 0.5,
62
+ :constraint => constraint_
63
+ )
64
+ end
65
+ end
66
+ end
data/lib/yowl/class.rb ADDED
@@ -0,0 +1,296 @@
1
+ module YOWL
2
+
3
+ class Class < YOWL::LabelledDocObject
4
+
5
+ include Comparable
6
+
7
+ attr_reader :resource
8
+ attr_reader :subClasses
9
+ attr_reader :associations
10
+
11
+ private
12
+ def initialize(resource, schema)
13
+ super(resource, schema)
14
+ @super_classes = nil
15
+ @subClasses = nil
16
+ @associations = nil
17
+ end
18
+
19
+ public
20
+ def Class.withUri(resource, schema)
21
+ if resource.anonymous?
22
+ warn "WARNING: Ignoring class with uri #{resource.to_s}"
23
+ return
24
+ end
25
+ klass = schema.classes[resource.to_s]
26
+ if klass
27
+ return klass
28
+ end
29
+ klass = Class.new(resource, schema)
30
+ schema.classes[resource.to_s] = klass
31
+ if schema.options.verbose
32
+ puts "Created class #{klass.short_name}"
33
+ end
34
+ return klass
35
+ end
36
+
37
+ public
38
+ def short_name()
39
+ sn = super()
40
+ if sn[0,7] == "http://" or sn[0,8] == "https://"
41
+ if sn.include?('#')
42
+ ns = sn.slice(/.*#/)
43
+ else
44
+ ns = sn.slice(/.*\//)
45
+ end
46
+ return sn[ns.length..-1]
47
+ end
48
+ return sn
49
+ end
50
+
51
+ public
52
+ def super_classes()
53
+ if not @super_classes.nil?
54
+ return @super_classes
55
+ end
56
+
57
+ @super_classes = []
58
+
59
+ @schema.model.query(
60
+ RDF::Query::Pattern.new(@resource, YOWL::Namespaces::RDFS.subClassOf)
61
+ ) do |statement|
62
+ #
63
+ # Only look at statements like these:
64
+ #
65
+ # <rdfs:subClassOf rdf:resource="<uri>"/>
66
+ #
67
+ # And ignore statements like these:
68
+ #
69
+ # <rdfs:subClassOf>
70
+ # <owl:Restriction>
71
+ # <owl:onProperty rdf:resource="<uri>"/>
72
+ # <owl:allValuesFrom rdf:resource="<uri>"/>
73
+ # </owl:Restriction>
74
+ # </rdfs:subClassOf>
75
+ #
76
+ if statement.object.uri?
77
+ superClass = Class.withUri(statement.object, @schema)
78
+ if superClass
79
+ if superClass != self
80
+ @super_classes << superClass
81
+ end
82
+ else
83
+ warn "WARNING: Could not find super class #{statement.object.to_s}"
84
+ end
85
+ end
86
+ end
87
+ return @super_classes
88
+ end
89
+
90
+ public
91
+ def hasSuperClasses?
92
+ return ! super_classes.empty?()
93
+ end
94
+
95
+ public
96
+ def hasSuperClassesInSchema?
97
+ super_classes.each() do |klass|
98
+ if @schema.classes.include?(klass.uri)
99
+ return true
100
+ end
101
+ end
102
+ return false
103
+ end
104
+
105
+ public
106
+ def subClasses()
107
+ if @subClasses
108
+ return @subClasses
109
+ end
110
+ @subClasses = Set.new
111
+
112
+ @schema.model.query(
113
+ RDF::Query::Pattern.new(nil, YOWL::Namespaces::RDFS.subClassOf, @resource)
114
+ ) do |statement|
115
+ subClass = Class.withUri(statement.subject, @schema)
116
+ if subClass
117
+ if subClass != self
118
+ @subClasses << subClass
119
+ end
120
+ else
121
+ warn "WARNING: Could not find sub class of #{short_name} with uri #{statement.subject.to_s}"
122
+ end
123
+ end
124
+ #@subClasses.sort! { |x,y| x <=> y }
125
+ return @subClasses
126
+ end
127
+
128
+ public
129
+ def hasSubClasses?
130
+ return ! subClasses.empty?()
131
+ end
132
+
133
+ public
134
+ #
135
+ # Return a collection of Associations representing ObjectProperties
136
+ # where the current class is one of the Domain classes.
137
+ #
138
+ def associations()
139
+ if not @associations.nil?
140
+ return @associations
141
+ end
142
+ @associations = Set.new
143
+
144
+ if @schema.options.verbose
145
+ puts "Searching for associations of class #{short_name}"
146
+ end
147
+
148
+ query = RDF::Query.new({
149
+ :property => {
150
+ YOWL::Namespaces::RDFS.domain => @resource,
151
+ RDF.type => YOWL::Namespaces::OWL.ObjectProperty,
152
+ YOWL::Namespaces::RDFS.range => :range
153
+ }
154
+ })
155
+
156
+ solutions = query.execute(@schema.model)
157
+ if @schema.options.verbose
158
+ puts " - Found #{solutions.count} solutions"
159
+ end
160
+ solutions.distinct!
161
+ if @schema.options.verbose
162
+ puts " - Found #{solutions.count} distinct solutions"
163
+ end
164
+
165
+ solutions.each do |solution|
166
+ property = solution[:property]
167
+ range = solution[:range]
168
+ if @schema.options.verbose
169
+ puts " - Found Association from #{short_name} to #{@schema.prefixedUri(range)}: #{@schema.prefixedUri(property.to_s)}"
170
+ end
171
+ rangeClass = Class.withUri(range, @schema)
172
+ if @schema.options.verbose
173
+ puts " - Found this class for it: #{rangeClass}"
174
+ end
175
+ if rangeClass
176
+ @associations << Association.new(property, @schema, self, rangeClass)
177
+ end
178
+ end
179
+ if @schema.options.verbose
180
+ puts " - Returning #{@associations.size} associations for class #{short_name}"
181
+ end
182
+ return @associations
183
+ end
184
+
185
+ public
186
+ #
187
+ # Add the current class as a GraphViz node to the given collection of nodes
188
+ # and to the given graph. Return the collection of nodes.
189
+ #
190
+ def addAsGraphvizNode (graph_, nodes_, edges_)
191
+ name = short_name
192
+ if @schema.options.verbose
193
+ puts "- Processing class #{name}"
194
+ end
195
+ #
196
+ # No need to add a node twice
197
+ #
198
+ if nodes_.has_key? uri
199
+ return nodes_, edges_
200
+ end
201
+ node = graph_.add_nodes(escaped_uri)
202
+ node.URL = "#class_#{short_name}"
203
+
204
+ prefix = nil
205
+ if name.include?(':')
206
+ prefix = name.sub(/:\s*(.*)/, "")
207
+ name = name.sub(/(.*)\s*:/, "")
208
+ end
209
+ name = name.split(/(?=[A-Z])/).join(' ')
210
+ if prefix
211
+ #
212
+ # Can't get HTML labels to work
213
+ #
214
+ #name = "<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\"><TR><TD>#{name}</TD></TR><TR><TD><I>(#{prefix})</I></TD></TR></TABLE>"
215
+ name = "#{name}\n(#{prefix})"
216
+ end
217
+ node.label = name
218
+
219
+ if hasComment?
220
+ node.tooltip = comment
221
+ else
222
+ if hasDefinition?
223
+ node.tooltip = definition
224
+ end
225
+ end
226
+ nodes_[uri] = node
227
+ return nodes_, edges_
228
+ end
229
+
230
+ public
231
+ #
232
+ # Generate a diagram for each class, the "per class diagram"
233
+ #
234
+ def perClassDiagramAsSvg
235
+ #if @schema.options.verbose
236
+ # puts "Generating SVG Per Class Diagram for #{short_name}"
237
+ #end
238
+
239
+ g = GraphvizUtility.setDefaults(GraphViz.new(:G, :type => :digraph))
240
+ g[:rankdir] = "LR"
241
+ g.node[:fixedsize] = false
242
+
243
+ nodes = Hash.new
244
+ edges = Hash.new
245
+ nodes, edges = addAsGraphvizNode(g, nodes, edges)
246
+
247
+ #
248
+ # Do the "outbound" associations first
249
+ #
250
+ associations.each do |association|
251
+ nodes, edges = association.rangeClass.addAsGraphvizNode(g, nodes, edges)
252
+ nodes, edges = association.addAsGraphVizEdge(g, nodes, edges)
253
+ end
254
+
255
+ #
256
+ # Then do the "inbound" associations
257
+ #
258
+ @schema.classes.values.to_set.each do |klass|
259
+ klass.associations.each do |association|
260
+ if self == association.rangeClass
261
+ nodes, edges = association.rangeClass.addAsGraphvizNode(g, nodes, edges)
262
+ nodes, edges = association.addAsGraphVizEdge(g, nodes, edges)
263
+ end
264
+ end
265
+ end
266
+
267
+ return GraphvizUtility.embeddableSvg(g)
268
+ end
269
+
270
+ #
271
+ # Create the GraphVis Edge for all "is a" (rdf:type) associations from a node
272
+ # (representing a Class or Individual) to another node (always representing a Class)
273
+ #
274
+ def Class.newGraphVizEdge(graph_, domainNode_, rangeNode_, constraint_ = true)
275
+ options = {
276
+ :arrowhead => :empty,
277
+ :arrowsize => 0.5,
278
+ :dir => :back,
279
+ :label => "is a",
280
+ :labeldistance => 2,
281
+ :penwidth => 0.5,
282
+ :constraint => constraint_
283
+ }
284
+ if not constraint_
285
+ options[:style] = :dashed
286
+ end
287
+ return graph_.add_edges(
288
+ rangeNode_,
289
+ domainNode_,
290
+ options
291
+ )
292
+ end
293
+
294
+ end
295
+
296
+ end