From ef3d96d024fccf962c2b290987f2ddb13222bde7 Mon Sep 17 00:00:00 2001 From: Francesco Date: Sat, 16 Apr 2022 19:11:59 +0200 Subject: [PATCH] Prepare: added concept of neighbours lib and trying to compute concepts without success --- prepare/build.gradle | 1 + prepare/lib/conceptualKNN.v1.6.jar | Bin 0 -> 36723 bytes prepare/src/main/guessNNprepare/Utils.scala | 12 ++++++++ .../mains/ComputeConcepts.scala | 28 ++++++++++++++++++ .../mains/ExtractEntities.scala | 11 ++----- 5 files changed, 43 insertions(+), 9 deletions(-) create mode 100644 prepare/lib/conceptualKNN.v1.6.jar diff --git a/prepare/build.gradle b/prepare/build.gradle index 322fff3..c763ee2 100644 --- a/prepare/build.gradle +++ b/prepare/build.gradle @@ -16,6 +16,7 @@ dependencies { implementation 'org.slf4j:slf4j-simple:1.7.36' implementation 'net.sourceforge.argparse4j:argparse4j:0.9.0' implementation 'org.json:json:20220320' + implementation files("lib/conceptualKNN.v1.6.jar") } sourceSets { diff --git a/prepare/lib/conceptualKNN.v1.6.jar b/prepare/lib/conceptualKNN.v1.6.jar new file mode 100644 index 0000000000000000000000000000000000000000..d271b9d5e444b0caad7a7128672c5abf3f636110 GIT binary patch literal 36723 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 XQgt@YXtWd;jVF znHR*D6cfw*tzPmib|`0T=TmWSCN1Qo1K@g>J=87b5c;(dEV*ht$jt55VsMemp%5rI zA|BWE(HGu@qrqdCfdDmV_=j-`oxr)Aa8iexw*&8|z-yYn7Gf zHcfqIHaQ4Erk$n6^(K4zUnrGEM-tK~9(p_z`9M*n>Z#$2kG+jkuInd25|jP~dE7Pi z!i7qNl?s9E(PbSgSn(Q-6mBuDWr5{#8bW4vN}gxi$2*eCHl(!-1yg0`#DRH#(1YM`0cIhvc?aUvjGd`3B&R}nN{K2$qBj^Tk*-^FGuT8SIsjs|69z%$qRe}Z zrh#4>Jx&H~%ZPv>$;)Pn-VY@r0Ml~X!xsUx2X?S;QRr8y{;R={7wNDRQeKDhIh|Qj z8x^5+2jG82&x|!yRO2<~i#tCPIg-LWZul8*2YEdmeRObAg)6R{&-p1sEn|q^h>dBm zFawP=Fd}H+hE^LQ=2sVh7I&t=z$_$$2kvZsGkV5rHjzhATf8L->+G&&vry2vLx3fp z-+Wn|ibM`lTH?c+fS5K~wKWqR#?MWZ!fAF8Vi)vQIeN57ORPAWDakEo6A#lt-yOG^ z6r(*WUEYMbfs#G8z_V+$J)u6)ME10QD!a&c9DvtM%Pw)ujn%#hZ!KmB_5H(H&p#%Zz?O+pkTDxI)>gizAE2f>2 zGykn%vow8+)GnyZFh-WObJPcZzbP;SVBtFe-@^J{K#C`EG`vHRPnHlK)Th4Yop`sg zaRHaVR3n?|&gduTDE3t?FnFqFmg1~Ih3A;p_}2HFbXf?=I0|&xxLYT!U1g~(!kT%A z_2(;YvaZIQ(GGgLqR3OlB|RBL>B_Hg?&<^Snxl7|>+5O)i5+zJtTk49O!{OL)|QZ?ai71?zQwTW8RDYqg8O z{~+|ZDc02KyhTu}Ubc3@inCjs?)(Xvr+U%osZADc@ee1DxZkoxZPPb-Z0}+sCy&_d zKWN7-Z2)9riDqU$u{`%w=@c(cfwF3G5dSg2gcgFX8E%CfW-c{$1wMCbOHQiUk~J)}q!?JW!SGyx&iPp@JKel8x z@k>h9Qi_W=lQZrpT8*k#+o4RQ6f3IAVw6l=IvxC^iSDrBrsas)WCG?(mf@ z>lTna!O|QXTAm<2IN4e53p9nm6#~STG;`+!bfJ?~B$AI%{T9!nl*PTn5<8u1?_g^6Ir>_vL$RSv?C0Fo# zl?sXB546-@t)JHBheRA*-z~D07Mto-5oJlqMYi&^zxwZyeQB?u?-J*nQicK}94fBq8(Vx%`XVlL?gX4nCtS+`_!VtEaG!tQ1@46q?fWO&2OI5MLgi!P zf$##yB+27~$WIV0H(*25xL|F=3WzN*7Bh00Q%gD!hv%HEO`{_vC&&5V!5sWyRxQ8I zaFnue>l5-#yn|oKGiRrJXLJ`A0)tzZi6QAMNB1M6E`Q=YWOm?^*^o(0b2(uipY)=?x6s0`-!_ZVOfQj}>^OP>~LpV|g?Bm>2Z#N%W2E zL6~zIDD;+yeIVhnv_SjUMKm@e^QlZQ&9Ji^dsEjwKD&E)inLgj)uQ4i4lNIDojQ7x zJw@5jtIAFg1V{0*EG6xB$VuMj_o@T9%&vqBv?^1}9HWB>drpwqJ#CHbIX%u5Eawj9 zWwNg{ig)70?0F2psUV$2t6Hdw|Z_YxzI`<|f7xy3afVx$P1sK$GW+f~dMwRnX z#XA-gQb$2lLNem;UkMzj@yMl|5GSObAYfj|E~7^F4Wso$IeCoAm4)%zq;reEYJd0* zJ;Bg(0vmbc3_i%PuRzhiU_Ow#C2Hriwi0&^B|Y%~Kap&U|0Xpj5B8vNh+=FytopfbKu79w~!fG4GYda%BI;F`=! zLRSIgU*;#ancc$8c3d-d{jYod%j+jLzL6@cu6yNyP6%ha*lBtKwvuy@4x5Y}icg8Z z`pQ#1Q#?{eEkJja(Oy1tBxlDhVN;s1EZAKM91t9MM`ofyZcrHr*^d{ zv>ps8R2IAC6LsJTDZRmaZ9%%LpFWck=CM09K&2?cuRqIEMV;y^Rj%9am@v)9ze5pQ zvvjK*-Hff&WAi`W2`o%R#@&;cADfsTCueDT5SJ&5(NynkS?#YuV=LZ5t1@uOPOHh|)ixUX zuPOvb-L@9Q-L+DE^CY$IgiSn>-t{u2j}xDci;^uTD9=L?D&Z3$E!CY)?OwzT5Q z%((8$=cikWOfGBmTLK$(qAbuXL7g}7LDpd=={pfDDTW=3`49-wG0l?%+e$!g7l1UC zub3VKEg;_GRJhbfq;$tUOb7JvEzHQGgJoi}Bq0ORnjcUIJ1HTtsgq(R($Aw_fFr34 z2zT0pi4zMkY~nXE%?(?ZY-)ov>O?vIKxPTri8E}c6(JiT8>&`g(TL#|5;s<=4mcad znIZn4EjxU$%0pkFu5I4izPDPdE(EVV^IX?r#3@C0ol5tz3QU z^$pk8N9>!I)h{!Onx^znA@uj;tj?G-b6bU8nFJ|J)3#U=b!b-T zYbNfbolI%rYt1))m01wtm9IG4;^OaZk3RSLs-OIsQ+&JXM%RhcwIO*IcIw~UDKCF2 zZnf!=EZK9WHn*~5Q@8&5XfiKvYnod0=E-Z1rDRubN>z#8m$JGw{J%J8=sWSW@8(!h z1_nKQd_&)uOT-}qw$O{OAcwt&WE7<)ra;DRrv^s{Uv?1rw@tHUnWpQzgo)N$G=<)q z3$U=sY%H0x@bHVrLP?#=Jk?eB{;|||`r8>WS5$sr|FKx+e4cm09HUdt--^D~Ot(${ z{Q7(UddKou<8p!UXQ{a}GVdJ9omlLCG*ezHBiu3fM^e%k40t2ZxZWjosC)Ry#8_Wyyi8YMBoPuv_6su!Mg-v2D( zS=XGf+WT8~9w@odzAdyc%Z&MUN=AH%je1N{#k~C?FS!1+%C!2mOpG4oe`>;{@+t~!8JLP;5T=grtw=x&MO|jCIEf1FyIa!$mK$ zB}#UNn_lNwrG!Y+*PuB zPrQ8L66P+xZe_)S;OX*)XSNv0iR*tmY;aL4FsgfUiH)1zQDIr`h$|mOgtexX=scd; zm-ofs%)j)h61&c27m2;f3{-1t^uFaMlCONd_j_M>>WuU89}QDpH$HCNBsjGpI^^NZ zVsX=VA6LZ+vqXO^YK~qgU!$V&byZ^R>#tfL4Sk+-FP-+HJM+p9GpBtExcmPb&(xD# zz2@rTW1BsmnRCyUSZ;6RynmC^)aC0guZlLA_pIebt4-n;jb9mWmfw}`(l$x&U7z6g zk%cq)9m}bSEIb|+la9$rRZmokP(R3~X>_e2k>hYf45y`9xRZh7>(?htQ|$!p96wJf z^x--l;5YG4PhZeSkyRggWshkF-Cw9_;rPoVZCU5~wU*l_Py1lxqb-mvWv($xd8uHL zS(j&#vdvdvBX2L|61_P-rgwWUEmsN*Gn}@hxzNWXcjhIv3vSac#Xqv%e)_?ZCs(97 zebw9oCz^g`2c>?!>W@K-f$PSNSdmlzd$hZ*<#0^=6yz6|B&O??l;reIaO6IuAmQ-- zx2V(eE3eFyj&U*ZtFg)MT6;zv&y82fa8TJVFQO=sMj z4(`eOz0K&EisKBozH^T>Y}GBi7QZ(*ecXHAgCG3UUs-wc$fvh*dbVF zAlHC{6kge*e>)mDzthaj02E~bDn$lxZN83vo^GzeA$q=U|4xA{V`SoDz-}Ed^pU_q zpxGs<#U&^fYsct>Am2<5EV7Wm5tx<`puYH0#AW2jZU;?~BHsoGy22a*3VETnf{j4F z&>Wx3LH7nCfP)nJ3?Z`pps+)}RRgq<7y)uH^y0i#5ZO?Wr;rb81Wm0WKn2ha)N2h< zN^GR-Ind2S-a!pI<`DtPEYZz`&nZL7eth8t+H#Emz}xE4oQK#-jqV`iy-cVfmyO31 zv<=zlh9d790o8E`U=xnpX;?Q!;qx_U;|T(&Mxh%GsZ7xwhrE6Pv=IdX!f}{@v@HeQ zFyvJOpd}9oV3mX2Ij9RD(9J`hG6$_SKmfs9?B>B!3EEUSy2;2>$e<~A1W3ulZZg>0 z1WZM4=b+}1b@|v$#hi>rcPVo1ftq^aTd|volKYU`OUOopsvqQH8dUutKx_wgqY;%6 h$ShnXEvR5e0RK*uVxE-^Bn2w!p94$eGN2>_0{|V%OLG7K literal 0 HcmV?d00001 diff --git a/prepare/src/main/guessNNprepare/Utils.scala b/prepare/src/main/guessNNprepare/Utils.scala index e4a1371..37d4d21 100644 --- a/prepare/src/main/guessNNprepare/Utils.scala +++ b/prepare/src/main/guessNNprepare/Utils.scala @@ -1,5 +1,7 @@ package guessNNprepare +import org.apache.jena.rdf.model.{InfModel, ModelFactory} +import org.apache.jena.reasoner.ReasonerRegistry import org.json.JSONArray import java.util.stream.StreamSupport @@ -8,6 +10,16 @@ import scala.util.{Failure, Success, Try} object Utils { + def loadMondialDataset(): Try[InfModel] = { + Option(ClassLoader.getSystemResourceAsStream("mondial_2022_04_04.n3")) + .map(stream => { + val kg: InfModel = ModelFactory.createInfModel(ReasonerRegistry.getTransitiveReasoner, ModelFactory.createDefaultModel) + kg.read(stream, null, "TTL") + Success(kg) + }) + .getOrElse(Failure(new RuntimeException("Impossible to open mondial dataset (should not happen)"))) + } + def JSONArrayElementsAs[T](array: JSONArray): Seq[T] = { StreamSupport.stream(array.spliterator(), false).toScala(LazyList) .map(obj => obj.asInstanceOf[T]) diff --git a/prepare/src/main/guessNNprepare/mains/ComputeConcepts.scala b/prepare/src/main/guessNNprepare/mains/ComputeConcepts.scala index 818ec22..f299d73 100644 --- a/prepare/src/main/guessNNprepare/mains/ComputeConcepts.scala +++ b/prepare/src/main/guessNNprepare/mains/ComputeConcepts.scala @@ -1,11 +1,17 @@ package guessNNprepare.mains +import conceptualKNN.utils.Table +import conceptualKNN.{ConceptualKNNModel, Partition} import guessNNprepare.{NamedEntity, Utils} import net.sourceforge.argparse4j.impl.Arguments import net.sourceforge.argparse4j.inf.{ArgumentParser, Namespace} +import org.apache.jena.sparql.core.Var +import org.apache.jena.sparql.engine.binding.BindingFactory import org.json.{JSONArray, JSONObject, JSONTokener} import java.nio.file.{Files, Path, Paths} +import java.util.concurrent.atomic.AtomicBoolean +import scala.jdk.CollectionConverters.SeqHasAsJava import scala.util.Try object ComputeConcepts extends MainCommand { @@ -15,15 +21,37 @@ object ComputeConcepts extends MainCommand { parser.description(description) parser.addArgument("guessable_entities").`type`(Arguments.fileType().verifyCanRead()).help("JSON file containing all guessable entities") + parser.addArgument("target").help("URI of the entity that should be guessed") } override def execute(ARGS: Namespace): Unit = { // CLI args val entitiesFilePath = Paths.get(ARGS.getString("guessable_entities")) + val guessTarget = ARGS.getString("target") println(s"Loading entities from ${entitiesFilePath}") val entities: List[NamedEntity] = loadEntitiesOrFail(entitiesFilePath) println(s"Loaded ${entities.length} entities") + if (!entities.exists(e => e.rdfResource.getURI == guessTarget)) { + System.err.println("Error: target entities is not part of the guessable entities") + System.exit(1) + } + println("Loading data graph...") + val dataGraph = Utils.loadMondialDataset().get + println(s"Loaded ${dataGraph.listStatements().toList.size()} triples") + + val entityVar = Var.alloc("e") + val entityTable = new Table(List(entityVar).asJava) + entities + .map(entity => dataGraph.createResource(entity.rdfResource)) + .map(resource => resource.asNode()) + .map(node => BindingFactory.binding(entityVar, node)) + .foreach(binding => entityTable.addBinding(binding)) + + val cnnPartition = new Partition(new ConceptualKNNModel(dataGraph), List(guessTarget).asJava, entityTable, 0) + println("Starting concept computation") + cnnPartition.fullPartitioning(new AtomicBoolean(false)) + println(s"Computation finished, ${cnnPartition.getNbConcepts} concepts computed") } diff --git a/prepare/src/main/guessNNprepare/mains/ExtractEntities.scala b/prepare/src/main/guessNNprepare/mains/ExtractEntities.scala index 61f8f73..ab9bc15 100644 --- a/prepare/src/main/guessNNprepare/mains/ExtractEntities.scala +++ b/prepare/src/main/guessNNprepare/mains/ExtractEntities.scala @@ -1,6 +1,6 @@ package guessNNprepare.mains -import guessNNprepare.NamedEntity +import guessNNprepare.{NamedEntity, Utils} import net.sourceforge.argparse4j.impl.Arguments import net.sourceforge.argparse4j.inf.{ArgumentParser, Namespace} import org.apache.jena.query.QueryExecutionFactory @@ -24,14 +24,7 @@ object ExtractEntities extends MainCommand { val jsonFilePath = ARGS.getString("json_file") println("Loading knowledge graph...") - val kg: InfModel = ModelFactory.createInfModel(ReasonerRegistry.getTransitiveReasoner, ModelFactory.createDefaultModel) - val mondialDataset: InputStream = Option(ClassLoader.getSystemResourceAsStream("mondial_2022_04_04.n3")) - .getOrElse({ - System.err.println("Impossible to open dataset") - System.exit(1) - null - }) - kg.read(mondialDataset, null, "TTL"); + val kg = Utils.loadMondialDataset().get printf("Loaded %s triples\n", kg.listStatements().toList.size) val guessableEntities = (List[NamedEntity]() ++ getMondialNamedEntities(kg, "Country") ++