Taxonomy.hs revision a604cbad8e2202147b5c6bb9f2e06ae61162d654
c63ebf815c8a874525cf18670ad74847f7fc7b26Christian MaederModule : $Header$
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederDescription : Taxonomy extraction for OWL
25cc5fbba63f84b47e389af749f55abbbde71c8cChristian MaederCopyright : (c) Dominik Luecke, Uni Bremen 2008
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederLicense : GPLv2 or higher, see LICENSE.txt
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederMaintainer : luecke@informatik.uni-bremen.de
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederStability : provisional
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederPortability : portabl
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederTaxonomy extraction for OWL2
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maedermodule OWL2.Taxonomy ( onto2Tax ) where
5e5d3e82af3bc2834f8718a52d9f45da80220273Dominik Lueckeimport qualified Data.Foldable as Fold
7bdc9c0783f9c8c830346e6baeac9306eee1a622Christian Maederimport qualified Common.Lib.Rel as Rel
ce8b15da31cd181b7e90593cbbca98f47eda29d6Till Mossakowskiimport qualified Data.Map as Map
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederimport qualified Data.Set as Set
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder-- | Derivation of an Taxonomy for OWL
8410667510a76409aca9bb24ff0eda0420088274Christian Maederonto2Tax :: TaxoGraphKind
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder -> MMiSSOntology
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder -> Sign -> [Named Axiom]
8410667510a76409aca9bb24ff0eda0420088274Christian Maeder -> Result MMiSSOntology
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus Luettichonto2Tax gk inOnto sig sens = case gk of
b1f59a4ea7c96f4c03a4d7cfcb9c5e66871cfbbbChristian Maeder KSubsort -> fail "Dear user, this logic is single sorted, sorry!"
ad270004874ce1d0697fb30d7309f180553bb315Christian Maeder KConcept -> do
4d56f2fa72e4aec20eb827c11ed49c8cbb7014bdChristian Maeder cs <- unsafePerformIO $ runClassifier sig sens
4cb215739e9ab13447fa21162482ebe485b47455Christian Maeder tree <- relBuilder cs
8ef75f1cc0437656bf622cec5ac9e8ea221da8f2Christian Maeder let subRel = Rel.transReduce $ foldl Rel.union Rel.empty tree
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus Luettich superRel = Rel.irreflex $ Rel.transpose subRel
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder superMap = Rel.toMap superRel
356fa49fe3e6a8398f92d13e9f920d0f093697ecChristian Maeder classes = Set.toList $ Set.map fst $ Rel.toSet subRel
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder makeMiss inOnto superMap classes
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian MaederdropClutter :: String -> String
8d97ef4f234681b11bb5924bd4d03adef858d2d2Christian MaederdropClutter a = fromMaybe a (stripPrefix "unamed:" a)
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- | Generation of a MissOntology
e593b89bfd4952698dc37feced21cefe869d87a2Christian MaedermakeMiss :: MMiSSOntology
7cc09dd93962a2155c34d209d1d4cd7d7b838264Christian Maeder -> Result MMiSSOntology
1aee4aaddde105264c1faf394d88e302c05094ffChristian MaedermakeMiss o r =
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder Fold.foldlM (\ x y -> fromWithError $ insertClass x (dropClutter y) ""
f041c9a6bda23de33a38490e35b831ae18d96b45Christian Maeder Nothing -> []
7cc09dd93962a2155c34d209d1d4cd7d7b838264Christian Maeder Just z -> Set.toList $ Set.map dropClutter z
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder-- | Builder for all relations
c3053d57f642ca507cdf79512e604437c4546cb9Christian MaederrelBuilder :: String
dcbd32289a7bdf1e6edd06c6ab0698c6a9dbf37aChristian Maeder -> Result [Rel.Rel String]
f4a2a20e49f41b2afa657e5e64d9e349c7faa091Christian MaederrelBuilder tr =
f4a2a20e49f41b2afa657e5e64d9e349c7faa091Christian Maeder let ln = filter (not . null) $ lines tr in
dcbd32289a7bdf1e6edd06c6ab0698c6a9dbf37aChristian Maeder if any (isPrefixOf "ERROR: ") ln || null ln then
d0279930f87bf39843e0bd2992a4789322662144Christian Maeder fail "Classification via Pellet failed! Ontology might be inconsistent!"
c2fcc35abb03cf0b4ca4b050efeb10827f38c322Christian Maeder else return $ map relBuild $ splitter $ map tail ln
356fa49fe3e6a8398f92d13e9f920d0f093697ecChristian Maeder-- | splitter for output
09d6f5d326545acfea43d3ffe1493c2176366475Christian Maedersplitter :: [String] -> [[String]]
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maedersplitter ls = case ls of
356fa49fe3e6a8398f92d13e9f920d0f093697ecChristian Maeder (h : t) -> let (l, r) = span (\ x -> head x == ' ') t in (h : l) : splitter r
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maeder-- | builder for a single relation
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian MaederrelBuild :: [String]
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian MaederrelBuild s = case s of
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maeder let nt = map (drop 3) ts
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maeder children = splitter nt
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maeder ch = foldl Rel.union Rel.empty $ map relBuild children
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maeder suc = map head children
0206ab93ef846e4e0885996d052b9b73b9dc66b0Christian Maeder in Rel.insert t t $ Rel.fromList (zip (repeat t) suc) `Rel.union` ch
b9b331bded61b8860edacac91df16ee19e465b42Christian Maeder-- | Invocation of Pellet
79e80c4b3f0ebb337d84415a50f29ccfc793e68bChristian MaederrunClassifier :: Sign -> [Named Axiom] -> IO (Result String)
79e80c4b3f0ebb337d84415a50f29ccfc793e68bChristian MaederrunClassifier sig sen = do
79e80c4b3f0ebb337d84415a50f29ccfc793e68bChristian Maeder let th = show $ printOWLBasicTheory (sig, filter isAxiom sen)
36f63902db2b3463faa9f59912ad106e2d5aaa24Klaus Luettich res <- runTimedPellet "classify" "PelletClassifier" th Nothing tLimit
f04e8f3ff56405901be968fd4c6e9769239f1a9bKlaus Luettich return $ case res of
f8e1a1eca871a26a535a4ee7d51902ba94b1db1eChristian Maeder Nothing -> fail $ "Timeout after " ++ show tLimit ++ " seconds!"
8cacad2a09782249243b80985f28e9387019fe40Christian Maeder Just (progTh, out, _) ->
363939beade943a02b31004cea09dec34fa8a6d9Christian Maeder if progTh then return out else fail "Pellet not found"