package com.cyc.tool.kbtaxonomy.viewer;
/*
* #%L
* KBTaxonomyViewer2015
* %%
* Copyright (C) 2015 Cycorp, Inc
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import com.cyc.tool.conceptfinder.ConceptMatch;
import com.cyc.tool.conceptfinder.ConceptSpace;
import com.cyc.tool.distributedrepresentations.BiologyW2VOpenCycSubspace;
import com.cyc.tool.distributedrepresentations.Word2VecSpace;
import com.cyc.tool.owltools.OpenCycContent;
import com.cyc.tool.owltools.OpenCycOwl;
import com.cyc.tool.kbtaxonomy.builder.OpenCycConcept;
import static com.cyc.tool.kbtaxonomy.viewer.JavascriptGraphs.jsPackages;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
/**
* <P>BioOpenCycViewer contains methods for implementing a Taxonomy Viewer that uses the
* Biology W2V space and OpenCyc.
*
*/
public class BioOpenCycViewer extends OpenCycViewer {
private ConceptSpace bioOcycConceptSpace;
private OpenCycOwl ocyc;
String nearestOCycQuery;
/** Creates a new instance of BioOpenCycViewer. */
public BioOpenCycViewer() {
}
@Override
public String getNearestOCycQuery() {
return nearestOCycQuery;
}
@Override
public void setNearestOCycQuery(String query) {
nearestOCycQuery = query;
}
@Override
public String getPagePrologue(WebParams params, String version) {
String page = "<!DOCTYPE html>"
+ "<meta charset=\"utf-8\">\n"
+ "<head>\n";
page += JavascriptGraphs.cssLinks();
page += jsPackages(params);
// final String conceptDetailEnabledParam = params.serialize().getConceptDetailEnabled(true);
page += "</head>\n"
+ "<body><h1>Biology Concepts Search</h1>\n"
+ "Version " + version + "\n";
return page;
}
@Override
public void prepareNearOpenCycTerms() {
selectedOCycConcepts.clear();
nearestOCyc.clear();
Collection added = new HashSet<String>();
try {
setUpSpaceIfNeeded();
List<ConceptMatch> nearTerms = new ArrayList<>();
nearTerms = bioOcycConceptSpace.findNearestNForPosition(nearestOCycQuery, 40, t -> String.join(" | ", ocyc.conceptsFor(t)));
for (ConceptMatch match : nearTerms) {
System.out.println("Match:" + match);
Arrays.asList(match.getConcept().split("\\s*\\|\\s*"))
.forEach(concept -> {
OpenCycContent instance;
if (!added.contains(concept)) {
added.add(concept);
try {
instance = new OpenCycContent(concept.replaceAll("http://sw.opencyc.org/concept/", ""));
String label = instance.getLabelForConcept();
Set<String> nlNames = new HashSet<>();
nlNames.add(label.replaceAll("#\\$", ""));
nearestOCyc.add(OpenCycConcept.create(label.replaceAll("#\\$", ""), nlNames, concept.replaceAll("http://sw.opencyc.org/concept/", "")));
// selectedOCycConcepts.add(label.replaceAll("#\\$", ""));
} catch (OWLOntologyCreationException ex) {
Logger.getLogger(BioOpenCycViewer.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
} catch (OWLOntologyCreationException | IOException | Word2VecSpace.NoWordToVecVectorForTerm ex) {
Logger.getLogger(OpenCycViewer.class
.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
public void setUpSpaceIfNeeded() throws IOException, OWLOntologyCreationException {
if (ocyc == null) {
ocyc = new OpenCycOwl();
}
if (bioOcycConceptSpace == null) {
bioOcycConceptSpace = new ConceptSpace(BiologyW2VOpenCycSubspace.get());
}
}
}