Taxonomy.hs revision a604cbad8e2202147b5c6bb9f2e06ae61162d654
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder{- |
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
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederMaintainer : luecke@informatik.uni-bremen.de
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederStability : provisional
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederPortability : portabl
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederTaxonomy extraction for OWL2
f4a2a20e49f41b2afa657e5e64d9e349c7faa091Christian Maeder-}
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maedermodule OWL2.Taxonomy ( onto2Tax ) where
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maederimport OWL2.MS
68d10d143f29fcff3c637ba24f90e983995ceae6Christian Maederimport OWL2.Sign
a53841f6d6e86ac751c12a33dc8aadf53f59d977Klaus Luettichimport OWL2.FunctionalPrint
a53841f6d6e86ac751c12a33dc8aadf53f59d977Klaus Luettichimport OWL.ProvePellet
a53841f6d6e86ac751c12a33dc8aadf53f59d977Klaus Luettich
a53841f6d6e86ac751c12a33dc8aadf53f59d977Klaus Luettichimport Common.AS_Annotation
a737caf82de97c1907027c03e4b4509eb492b4b8Christian Maederimport Common.Result
68d10d143f29fcff3c637ba24f90e983995ceae6Christian Maederimport Taxonomy.MMiSSOntology
96646aed2ae087b942ae23f15bbe729a8f7c43d3Christian Maederimport Common.Taxonomy
01e383014b555bbcf639c0ca60c5810b3eff83c0Christian Maeder
3b06e23643a9f65390cb8c1caabe83fa7e87a708Till Mossakowskiimport System.IO.Unsafe
9dac90ec2be2a72e03893095461960d483fe2fc2Christian Maeder
5e5d3e82af3bc2834f8718a52d9f45da80220273Dominik Lueckeimport qualified Data.Foldable as Fold
7bdc9c0783f9c8c830346e6baeac9306eee1a622Christian Maederimport qualified Common.Lib.Rel as Rel
ce8b15da31cd181b7e90593cbbca98f47eda29d6Till Mossakowskiimport qualified Data.Map as Map
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maederimport Data.List
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maederimport Data.Maybe
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederimport qualified Data.Set as Set
a1ed34933c266ce85066acb0d7b20c90cb8eb213Christian Maeder
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
55adfe57a4de1f36adc3e3bfc16f342e44a7d444Christian Maeder
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian MaederdropClutter :: String -> String
8d97ef4f234681b11bb5924bd4d03adef858d2d2Christian MaederdropClutter a = fromMaybe a (stripPrefix "unamed:" a)
f4a2a20e49f41b2afa657e5e64d9e349c7faa091Christian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- | Generation of a MissOntology
e593b89bfd4952698dc37feced21cefe869d87a2Christian MaedermakeMiss :: MMiSSOntology
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder -> Map.Map String (Set.Set String)
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder -> [String]
7cc09dd93962a2155c34d209d1d4cd7d7b838264Christian Maeder -> Result MMiSSOntology
1aee4aaddde105264c1faf394d88e302c05094ffChristian MaedermakeMiss o r =
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder Fold.foldlM (\ x y -> fromWithError $ insertClass x (dropClutter y) ""
51d769d55d88dfa88bdf54bee78d8fa85a2deba8Christian Maeder (case Map.lookup y r of
f041c9a6bda23de33a38490e35b831ae18d96b45Christian Maeder Nothing -> []
7cc09dd93962a2155c34d209d1d4cd7d7b838264Christian Maeder Just z -> Set.toList $ Set.map dropClutter z
51d769d55d88dfa88bdf54bee78d8fa85a2deba8Christian Maeder ) Nothing) o
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder
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
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder
356fa49fe3e6a8398f92d13e9f920d0f093697ecChristian Maeder-- | splitter for output
09d6f5d326545acfea43d3ffe1493c2176366475Christian Maedersplitter :: [String] -> [[String]]
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maedersplitter ls = case ls of
356fa49fe3e6a8398f92d13e9f920d0f093697ecChristian Maeder [] -> []
356fa49fe3e6a8398f92d13e9f920d0f093697ecChristian Maeder (h : t) -> let (l, r) = span (\ x -> head x == ' ') t in (h : l) : splitter r
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maeder
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maeder-- | builder for a single relation
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian MaederrelBuild :: [String]
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maeder -> Rel.Rel String
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian MaederrelBuild s = case s of
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maeder [] -> Rel.empty
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maeder (t : ts) ->
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
f13d1e86e58da53680e78043e8df182eed867efbChristian Maeder
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 tLimit = 800
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"
a7c27282e71cf4505026645f96d4f5cb8a284e32Christian Maeder