Giter Site home page Giter Site logo

rothamsted / knetbuilder Goto Github PK

View Code? Open in Web Editor NEW
12.0 10.0 11.0 22.15 MB

KnetBuilder data integration platform for building knowledge graphs. Previously known as ondex.

Home Page: https://knetminer.com

License: MIT License

NSIS 0.32% Batchfile 0.01% Shell 0.34% Java 98.40% JavaScript 0.78% HTML 0.01% FreeMarker 0.02% Python 0.05% XSLT 0.03% PowerShell 0.04% Cypher 0.01%

knetbuilder's Introduction

Ondex-KnetBuilder

Ondex is a framework for text mining, data integration and data analysis.

Requirements

  • At least Java 17. Note that we have migrated to this recently and Ondex doesn't work with Java 11 anymore.

Downloads

Documentation

  • A tuturial on building knowledge grahs with KnetBuilder is available here

  • We keep most of our documentation on this repository's wiki (note that there are many links on the right column in that page).

Code Repository Organisation

This repository is a rather big code base. The main submodules that it contains are described below.

ondex-full

This is the top-level POM, defining many common things shared by Ondex code.

ondex-base

The base code, used to build everything else.

ondex-knet-builder

What we use to build projects like KNetMiner.

ondex-desktop

Components for the desktop/GUI applications.

ondex-opt

Optional components. NOTE: these are still linked by the components above (so, not so optional), but we usually build them separately. If you build the whole ONDEX from this top repository, these optional modules will be built from (the local clone of) this child repository, if you build an ONDEX component independently (e.g., by cloning ondex-base and building from its local copy), some of these 'optional' components are still downloaded from our Maven repositories as dependencies. This is because it is currently hard to modularise things further (we would need to inspect the Java code).

Old code repositories and materials

Documentation and tutorials. Now replaced by the Wiki.

Old components, which are no longer used by ONDEX, not even as dependencies taken from our Maven repository.

knetbuilder's People

Contributors

ajitps avatar jojicunnunni avatar josephhearnshaw avatar keywanhp avatar marco-brandizi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

knetbuilder's Issues

Remove GO: prefix from accessions

GO accessions need to be modeled in a more consistent way. The new OWL ontology parser creates accessions without GO, TO prefix, I suggest to implement the same behavior in UniProt, GAF and other parsers that create GO annotations.

AbstractMetaData.equals() is wrong, it should check specific subclasses

This already fixed. I'm reporting it to keep track of the issue and also to warn that we should keep in mind the changes this fix required, in case of other bugs or strange behaviours.

AbstractMetaData.equals( o ) is fine when the o.getClass() is MetaData. I've discovered that this wrong in a case where I had a ConceptClass with ID Chromosome and an AttributeName with the same ID = 'Chromosome'. If you compare them with the current implementation, they result equal, cause it's the same ID, however they are obviously two different entity types.

Exact match of this.getClass() and o.getClass() doesn't seem to be enough either, since, for instance, ConceptClassImplA and ConceptClassImplB should be considered the same if they don't differ conceptually. The solution is checking against the right interface in the right hierarchy level (e.g., o.getClass () instanceof AttributeName).

TAB Parser - relation type merging

Ondex graph is restricted to one type X relation between two nodes. What does the TAB parser do when a it has already created a relation between A-B and a new A-B relation occurs in the TAB file, however, which has different attributes?

We can discuss options here...

Remove all System.setProperty() involving XML components and alike

A lot of Ondex code behaves like this:

System.setProperty(
  "javax.xml.stream.XMLInputFactory", "com.ctc.wstx.stax.WstxInputFactory"
);

XMLInputFactory2 xmlif = (XMLInputFactory2) XMLInputFactory2.newInstance();

That's bad practice, since it forces the whole JVM hosting this code to use a particular XML component. This has already happened to conflict with web servers, both Jetty and Tomcat.

I'm already working on fixing the problem, by adopting this other approach:

System.setProperty(
  "ondex.javax.xml.stream.XMLInputFactory", "com.ctc.wstx.stax.WstxInputFactory"
);

XMLInputFactory2 xmlif = (XMLInputFactory2) XMLInputFactory2.newFactory (
     "ondex.javax.xml.stream.XMLInputFactory", this.getClass ().getClassLoader ()
);

newFactory( propName, loader ) takes the class to be used as factory from the property name parameter. By using an Ondex-specific property name for that, which is not the name that methods like newFactory() or newInstance() lookup by default, we can avoid to interfere with the rest of the JVM.

Note that direct instantiation of WstxInputFactory doesn't always work in a straightforward way, since some plugins/modules instantiate factories like this dynamically, without having a declared dependency on, in this case, the Woodstox library (they get it indirectly, from containers like OVTK2 or the workflow engine).

Possible improvement

Due to issues with dependency management in Ondex, I'm changing the existing code by duplicating lines like the ones above. Ideally, they should be factorised into a component provider, which would set the ondex.* properties once (upon class loading) and would return components like XMLInputFactory2, XMLOutputFactory2 etc.

ONDEX doesn't work with Maven Assembly version >= 3.0.0

I've tried to move the version of Assembly that ONDEX uses from 2.2-beta-5 to 3.0.0 (the last one). That was needed to fix problems about directory created by the plugin with wrong permissions. Horrible things happened, mainly files are totally missing from the final distribution archives.

This is also the reason why #3 emerged.

After having been trying to debug for one day, I've decided to go back to a previous version. I'll create the branch #20170324_issue4_assembly3 to store the changes I've done somewhere and then I'll roll back (partially).

Cytoscape/JSON exporter, abbreviated concept names clash with colour highlights

I discovered this while working on Rothamsted/knetminer#673. AddConceptNodeInfo abbreviated the exported concept label to 33 characters (including the auto-added '...'), see getNodeJson() here.

This is error-prone, since the concept names might come in with highlighting markings like:

Hello, <span style="background-color: #011A0F"><b>World</b></span>!

the abbreviation could cut away relevant HTML wrappers and garble everything. A possible solution might be
taking spanIdx = name.lastIndexOf ( "</span>" ) + "</span>".length() and use min ( 33, spanIdx ) as the abbreviation cutoff.

As a side note, all the rest of Knetminer abbreviates at 63.

OXL exporter combined with JAXB generates wrong results with newlines, due to recent JDK 1.8 bug

This is to keep track of a recent fix about the OXL exporter.

Reporting the same text in comments:

This is to fix bug in JDK >8u151

In short, when some text is serialised to XML using JAXB, newlines are wrongly escaped by an internal JDK component.

If you see how they patched it, the problem is that at some point in the XML-writing pipeline XMLStreamWriter.writeEntityRef(String) is called with the wrong code '#xa' or '#xd' (corresponding to '\r' or '\n'). This is produced by some JDK-internal escape handler (again, see their linked patch).

Waiting for the release of a new JDK, we do as they do in the fix: our writeEntityRef(String)
wrapper re-writes \r or \n if it sees one of the wrong codes, thus eliminating
the wrong escaping that happens in the JDK.

TODO: hopefully, this fix won't be needed anymore once JDK8u192 is released (or if you manage to move to JDK >8), so
we will be able to remove this wrapper from Export.start()

This was first fixed and then I'm filing this issue and closing it immediately.

Parsing co_321.owl throws an error

Using ondex-mini-3.0 and the latest co_cfg.xml and following workflow snippet:

Need a way to add the CO_321: prefix to accessions...

<Parser name="owlParser">
	<Arg name="graphId">default</Arg>
	<Arg name="InputFile">${baseDir}/ontologies/co_321.owl</Arg>		
	<Arg name="configFile">${configDir}/generic/ontologies/co_cfg.xml</Arg>
</Parser>
Expanded workflow can be found at: /tmp/test_co_wf.xml8057266839365871070expanded
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'defaultOwlMapper' defined in URL [file:/home/data/knetminer/pub/config/generic/ontologies/default_mappings.xml]: Cannot resolve reference to bean 'conceptMapper' while setting bean property 'conceptMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'conceptMapper' defined in URL [file:/home/data/knetminer/pub/config/generic/ontologies/default_mappings.xml]: Cannot resolve reference to bean 'accessionsMapper' while setting bean property 'accessionsMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'accessionsMapper' defined in URL [file:/home/data/knetminer/pub/config/generic/ontologies/co_cfg.xml]: Cannot create inner bean 'idAccMapper$child#51dbd6e4' while setting bean property 'mappers' with key [0]; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'idAccMapper$child#51dbd6e4' defined in URL [file:/home/data/knetminer/pub/config/generic/ontologies/co_cfg.xml]: Could not resolve parent bean definition 'idAccMapper'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'idAccMapper' available
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1531)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1276)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
	at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:140)
	at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:84)
	at net.sourceforge.ondex.parser.owl.OWLMapper.mapFrom(OWLMapper.java:147)
	at net.sourceforge.ondex.parser.owl.plugin.OWLParser.start(OWLParser.java:81)
	at net.sourceforge.ondex.workflow.engine.Engine.runParser(Engine.java:443)
	at net.sourceforge.ondex.workflow.engine.PluginProcessor$5.run(PluginProcessor.java:135)
	at net.sourceforge.ondex.workflow.engine.PluginProcessor$5.run(PluginProcessor.java:133)
	at net.sourceforge.ondex.workflow.engine.PluginProcessor.execute(PluginProcessor.java:83)
	at net.sourceforge.ondex.workflow.engine.BasicJobImpl.run(BasicJobImpl.java:110)
	at net.sourceforge.ondex.WorkflowMain.main(WorkflowMain.java:216)
	at net.sourceforge.ondex.OndexMiniMain.main(OndexMiniMain.java:7)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'conceptMapper' defined in URL [file:/home/data/knetminer/pub/config/generic/ontologies/default_mappings.xml]: Cannot resolve reference to bean 'accessionsMapper' while setting bean property 'accessionsMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'accessionsMapper' defined in URL [file:/home/data/knetminer/pub/config/generic/ontologies/co_cfg.xml]: Cannot create inner bean 'idAccMapper$child#51dbd6e4' while setting bean property 'mappers' with key [0]; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'idAccMapper$child#51dbd6e4' defined in URL [file:/home/data/knetminer/pub/config/generic/ontologies/co_cfg.xml]: Could not resolve parent bean definition 'idAccMapper'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'idAccMapper' available
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1531)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1276)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
	... 23 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'accessionsMapper' defined in URL [file:/home/data/knetminer/pub/config/generic/ontologies/co_cfg.xml]: Cannot create inner bean 'idAccMapper$child#51dbd6e4' while setting bean property 'mappers' with key [0]; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'idAccMapper$child#51dbd6e4' defined in URL [file:/home/data/knetminer/pub/config/generic/ontologies/co_cfg.xml]: Could not resolve parent bean definition 'idAccMapper'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'idAccMapper' available
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:313)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:122)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedSet(BeanDefinitionValueResolver.java:394)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:161)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1531)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1276)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
	... 33 more
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'idAccMapper$child#51dbd6e4' defined in URL [file:/home/data/knetminer/pub/config/generic/ontologies/co_cfg.xml]: Could not resolve parent bean definition 'idAccMapper'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'idAccMapper' available
	at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:1278)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:282)
	... 45 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'idAccMapper' available
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:687)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1207)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:985)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:1262)
	... 46 more
srun: error: rothhpc401: task 0: Exited with exit code 2

Also tried test wheat CO workflow from here, with error:

Error: Could not open and parse the workflow file. See stack trace for details.
Expanded workflow can be found at: /tmp/test_co_wf.xml391592625769402541expanded
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import bean definitions from URL location [file:/home/data/knetminer/software//ondex-mini/config/owl-parser/co_cfg.xml]
Offending resource: URL [file:/home/data/knetminer/pub/config/triticum_aestivum/owl-parser/co_wheat_cfg.xml]; nested exception is org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 65 in XML document from URL [file:/home/data/knetminer/software//ondex-mini/config/owl-parser/co_cfg.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 65; columnNumber: 54; Element type "property" must be followed by either attribute specifications, ">" or "/>".
	at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:70)
	at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85)
	at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:76)
	at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:233)
	at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseDefaultElement(DefaultBeanDefinitionDocumentReader.java:184)
	at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:169)
	at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:142)
	at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:94)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:508)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:392)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:252)
	at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:127)
	at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:93)
	at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
	at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:613)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:514)
	at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:140)
	at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:84)
	at net.sourceforge.ondex.parser.owl.OWLMapper.mapFrom(OWLMapper.java:147)
	at net.sourceforge.ondex.parser.owl.plugin.OWLParser.start(OWLParser.java:81)
	at net.sourceforge.ondex.workflow.engine.Engine.runParser(Engine.java:443)
	at net.sourceforge.ondex.workflow.engine.PluginProcessor$5.run(PluginProcessor.java:135)
	at net.sourceforge.ondex.workflow.engine.PluginProcessor$5.run(PluginProcessor.java:133)
	at net.sourceforge.ondex.workflow.engine.PluginProcessor.execute(PluginProcessor.java:83)
	at net.sourceforge.ondex.workflow.engine.BasicJobImpl.run(BasicJobImpl.java:110)
	at net.sourceforge.ondex.WorkflowMain.main(WorkflowMain.java:216)
	at net.sourceforge.ondex.OndexMiniMain.main(OndexMiniMain.java:7)
Caused by: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 65 in XML document from URL [file:/home/data/knetminer/software//ondex-mini/config/owl-parser/co_cfg.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 65; columnNumber: 54; Element type "property" must be followed by either attribute specifications, ">" or "/>".
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:399)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217)
	at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:227)
	... 28 more
Caused by: org.xml.sax.SAXParseException; lineNumber: 65; columnNumber: 54; Element type "property" must be followed by either attribute specifications, ">" or "/>".
	at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
	at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
	at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
	at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
	at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
	at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
	at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
	at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
	at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
	at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
	at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:76)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadDocument(XmlBeanDefinitionReader.java:429)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:391)
	... 33 more
srun: error: rothhpc401: task 0: Exited with exit code 2

Issues with custom data

I have created poplar data based on potato tutorial data format. I am able to create oxl file using

./ondex-mini/runme.sh /var/www/html/knet/poplar_data/workflow.xml "baseDir=/var/www/html/knet/poplar_data"

All inputs and output (kg_final.oxl) are hosted at http://ec2-18-225-37-206.us-east-2.compute.amazonaws.com/knet/ temporarily.

How to verify kg_final.oxl is ok?

As I tried to query network using knetminer and did not work. Attached is log file(ws.log) for run.

Migrate to Log4j 2 using the 1/2 bridge.

Use this to change all Ondex modules so that:

  • They depend on log4j-api-2
  • They also depend on log4j-1.2-api, which will reroute all Log4j v1 to version 2 (ie, to the API above)
  • Same for slf4j and common logging (TODO: link to bridges), but Log4j v1 is a priority
  • Modules that use a concrete implementation of any logger, migrate to log4j-core as their implementation
    (so that all of the above is re-routed).
    • This also requires that the log4j.xml files are migrated to v2 (YAML flavour preferrable)
    • A good way to deal with the config files is downloading them from a single place (like the data module)

This is to address the recent security issues discovered with old Log4j. It has not a very high priority, since said issues are relevant only for web servers, yet, the migration above would remove many warnings triggered by dependabots and IT people.

Biocyc parser exception with aracyc biopax-level2.owl

Using the biocyc parser with the latest version of AraCyc biopax-level2.owl release 8 gives a null pointer exception here:

workflow:

<Parser name="biocyc">
	<Arg name="TaxId">3702</Arg>
	<Arg name="DataSource">AraCyc</Arg>
	<Arg name="InputFile">biopax-level2.owl</Arg>
	<Arg name="graphId">default</Arg>
</Parser> 

Error:
java.lang.NullPointerException
at net.sourceforge.ondex.parser.biocyc.handler.ReactionHandler.processReaction(ReactionHandler.java:115)
at net.sourceforge.ondex.parser.biocyc.handler.ReactionHandler.(ReactionHandler.java:39)
at net.sourceforge.ondex.parser.biocyc.Parser.start(Parser.java:194)
at net.sourceforge.ondex.workflow.engine.Engine.runParser(Engine.java:443)
at net.sourceforge.ondex.workflow.engine.PluginProcessor$5.run(PluginProcessor.java:135)
at net.sourceforge.ondex.workflow.engine.PluginProcessor$5.run(PluginProcessor.java:133)
at net.sourceforge.ondex.workflow.engine.PluginProcessor.execute(PluginProcessor.java:83)
at net.sourceforge.ondex.workflow.engine.BasicJobImpl.run(BasicJobImpl.java:110)
at net.sourceforge.ondex.WorkflowMain.main(WorkflowMain.java:216)
at net.sourceforge.ondex.OndexMiniMain.main(OndexMiniMain.java:7)

Lucene module, search by accession and other issues

The LuceneEnv and LuceneQueryBuilder components are rather messy and it's often unclear how they should be used and for what purpose its methods were designed. For instance, searchConceptByConceptAccessionExact() and similar *Exact methods were searching accessions by keywords, so not so exact. Now I've fixed them, but the search is still case-insensitive, because the Lucene standard analyzer can't deal with case-sensitive indexing+searches, nor is it easy to switch to another analyzer, read on for details.

Because of the same reason, I've had to introduce an analyzer (DEFAULTANALYZER) that uses PerFieldAnalyzerWrapper to use different analyzers for fields like concept class ID (uses keyword analyzer) or concept attribute value (uses the standard analyzer). The rationale of this is that the ID fields are to be indexed and searched with a full identity criterion, while others are dedicated to user free-text searches and hence are best served by the standard analyzer (ie, tokenisation, stop words, case insensivity, etc). In fact, if fields like Concept Class ID or data source name are indexed and searched with the standard analyzer, we have a number of problems, like upper case strings not working at all when saved as StringField, or unwanted substring matching (eg, "00633" matches both "00633" and "go 00633", which, in general, is wrong). Details are discussed here and some tests of mine are here.

Switching accession fields isn't so easy and I'll do it later. The problem with them is that they're saved with a field name like ConceptAccession_<dataSourceId>, eg, ConceptAccession_GO. This doesn't fit into the way PerFieldAnalyzerWrapper works (ie, it uses a map of field name -> analyzer), plus, it doesn't seem to play well with un-tokenised fields that can be multi-value.

As the latest link suggests, the proper solution is to store separated documents for the 1-n accession values (ie, one Lucene document with concept ID + accession + data source per each accession, which might result into multiple documents of this type, sharing the same concept ID, or even the same concept ID + data source).

But even before that, it would be worth to check the last fixes mentioned above. Regarding this:

Knetminer doesn't seem to be affected.
As for Ondex, there are a couple of plugins using the accession search methods mentioned above, which don't seem to be in use. These are:

  • decypher module (Blast, Decypher, Hmmer, Mapping), this is in the modules-opt subtree
  • generic module
    • relationneighbours/Filter
    • net.sourceforge.ondex.mapping.accessionbased.Mapping (seems no longer in use, replaced by lowmemoryaccessionbased)
    • net.sourceforge.ondex.mapping.lowmemoryaccessionbased.Mapping (fixed)
  • Mappers in go module (I think it was replaced by the OWL parser).

PubMed parser doesn't get YEAR anymore

The text mining module doesn't pick YEAR anymore from the PubMed XML. I've investigated it and I found that the current XML is like:

<MedlineCitation Status="PubMed-not-MEDLINE" Owner="NLM">
    <PMID Version="1">29545818</PMID>
    <DateRevised>
        <Year>2018</Year>
        <Month>03</Month>
        <Day>18</Day>
    </DateRevised>
    <Article PubModel="Electronic-eCollection">
        <Journal>
            <ISSN IssnType="Print">1664-462X</ISSN>
            <JournalIssue CitedMedium="Print">
                <Volume>9</Volume>
                <PubDate>
                    <Year>2018</Year>
                </PubDate>
            </JournalIssue>
            ...
        </Journal>
         ...
        <ArticleDate DateType="Electronic">
            <Year>2018</Year>
            <Month>03</Month>
            <Day>01</Day>
        </ArticleDate>
        ...

The parser doesn't work because it looks for MedlineCitation/Article/CreationDate/*, which is not there. My understanding is that it should catch MedlineCitation/Article/ArticleDate/Year/* instead.

Please confirm me it's like that. The XML I've checked is the same as #12 .

ondex-mini - Building plugins with new changes fails [sequence.jar]

Made some changes to the fasta_gff3 parser in ondex-knet-builder repo under modules/sequence and tried to take sequence.jar and use it as follows:

  1. with existing older Ondex desktop and Ondex-mini installed on Windows and those failed.

  2. Testing the new sequence.jar on Linux (by moving it under plugins/ in an existing ondex-mini install) gave the following error:
    Invalid constant pool index 319 in class file net/sourceforge/ondex/export/fasta/Export

  3. Assuming it's due to recent ondex-knet-builder Java 8 and Maven assembly plugin (3.3.0 -> 3.3.9) upgrades, I then built the ondex-mini module in the ondex-knet-builder repo and tested that on both Windows and Linux and got the following error on both:
    Exception in thread "main" java.lang.NoClassDefFoundError: net/sourceforge/ondex/WorkflowMain
    at net.sourceforge.ondex.OndexMiniMain.main(OndexMiniMain.java:7)
    Caused by: java.lang.ClassNotFoundException: net.sourceforge.ondex.WorkflowMain
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

Note: Other users also report seeing the same error.

UniProtKB parser issues with diseases

Example protein: https://www.uniprot.org/uniprot/P21810

Parse all this information:

<comment type="disease" evidence="7">
<disease id="DI-04786">
<name>Spondyloepimetaphyseal dysplasia, X-linked</name>
<acronym>SEMDX</acronym>
<description>
A X-linked recessive bone disease characterized by severe short-trunk dwarfism, brachydactyly, metaphyseal flaring of lower extremities, short and broad long bone diaphyses, moderate platyspondyly, normal facies, and normal intelligence.
</description>
<dbReference type="MIM" id="300106"/>
</disease>
<text>
The disease is caused by mutations affecting the gene represented in this entry.
</text>
</comment>

Do not parse this:

<dbReference type="MIM" id="300106">
<property type="type" value="phenotype"/>
</dbReference>
<dbReference type="MIM" id="300989">
<property type="type" value="phenotype"/>
</dbReference>
<dbReference type="MIM" id="301870">
<property type="type" value="gene"/>
</dbReference>

CytoscapeJS plugin, add option to export pure-JSON

net.sourceforge.ondex.export.cyjsJson.Export exports JSON-like data in this format:

{
  "graph": "var graphJSON= { \"nodes\": [{ \"data\": { \"annotation\": \"PROTEIN_CODING\" ...
  var allGraphData= { \"ondexmetadata\": { \"graphName\": \"FilteredGraphUnconnected\", \"concepts\": [{...}]...};"
}

A real example. The class comments has more details on it.
While this is a structure that is useful for the Javascript that builds the network view, it's not useful anywhere else.

We need to add a boolean argument to the Exporter plug-in, named like exportPlainJSON (default is false). If this is set, we need to call a variant of writeJSONToFile(), let's say writePlainJSON(), which will produce actual JSON, in a form like:

{
  "graphJSON": { 
     "nodes": [...],
     "edges": [...]
   },
  "allGraphData": {
     "ondexmetadata": {...}
  }

That is, "graph" is removed from the root, no variable declaration, no comma escaping, just plain JSON should come out of it. This is easy to produce, we just need to compose graphJson and metadataJson into a new JSONObject and then write the latter using its toString(), no formatJson(), no semicolon or '=' addition.

This new plug-in argument will come from the Knetminer API (about to write a separated ticket for it).

GAF parser review and enhancement

The GAF file format (v2.2) seems to have evolved since I last looked at it. Especially the information in qualifier-column-4 looks very useful. This column is populated with relations from the Relations Ontology that indicate the intended meaning, or interpretation, of a gene product-to-GO term association. Allowed values are listed in the table below; for negation, “NOT” may be prepended to a relation with a pipe. http://geneontology.org/docs/go-annotation-file-gaf-format-2.2/#qualifier-column-4

Our GAF parser needs to be reviewed and potentially improved/simplified to use gene-go relation types as specified in column 4. This is the code that sets the relation type:

Use of semanticmotifs?

How do you define semanticmotifs.txt for a new species? Where is it used? Is it important for building network or important for mining network or both?

Only parse UniProt data containing a specific keyword within Publications

It would be good to enable a way to filter the OXL data directly based upon a search term being present within a Publication; this would create more concise and relevant knowledge-networks.

i.e. Searching for Alzheimer's to create a more Alzheimer's specific OXL for Human. Or a search term for more specific plant datasets. This may be useful for certain diseases in both Animals & Plants, respectively.

Can be expanded to include 'AND', 'OR', 'AND+' statements.

Labels in the CytoscapeJS plug-in should be the same used in the rest of KnetMiner

The CytoscapeJS plugin generates JSON data that KnetMiner uses to build the network view. Currently, there is a mismatch between the node labels that are reported in this JSON and the labels used by the rest of KnetMiner.

Namely,

  • KnetMiner uses KGUtils.getBestName ( ONDEXConcept )
  • While the CyJS exporter uses some hardwired code to produce the JSON attributes value and
    displayValue

We should replace the second with the former. However, this also requires some refactorisation:

  • KGUtils.getBestXXX methods should be moved to Ondex, inside the module
    net.sourceforge.ondex.core:base, inside the package net.sourceforge.ondex.core.util, where I propose to
    create a new class named like GraphLabelsUtils.
    • We need this in order to make these methods available to the exporter plug-in at issue (we can't import
      KnetMiner modules in Ondex, since that would create circular dependencies).
    • Also note that the module containing KGUtils contains unit tests as well, and these need to be migrated too
  • KnetMiner dependencies on the above methods should be updated accordingly.

These changes should be enough to address Rothamsted/knetminer#612, we need to test the results in the UI.

OVTK2 Dependencies I cannot find anywhere

I've problems with these dependencies in the ovtk2 module:

>       <!--  dependency>
> <groupId>net.sourceforge.ondex.webservices</groupId>
>          <artifactId>soapgraph</artifactId>
>          <version>0.5.0</version>
>       </dependency>
>
>       <dependency>
> <groupId>net.sourceforge.ondex.webservices</groupId>
>          <artifactId>webservice-client</artifactId>
>          <version>0.5.0</version>
>       </dependency>
>
>       <dependency>
> <groupId>net.sourceforge.ondex.taverna</groupId>
>          <artifactId>taverna-api</artifactId>
>          <version>0.5.0</version>
>       </dependency -->

The 0.5.0 version used to be in our Nexus, but they've disappeared (probably because of some cleaning operation). I cannot find them anywhere else (in particular, I cannot find the sources).

What are they for? Can we remove them from ONDEX? At the moment I see several Java classes that import them, but they all seem to be menu items and other invocation elements.

Tabular parser sets concept name preferred flag to false

When nodes from multiple lines get "merged" - the preferred flag from the first line is set correctly, but subsequent lines are automatically set to preferred=false. Is this a bug or is there a setting to change the default merge behaviour?

Tabular file

Foo    pref-name-1    
Foo    pref-name-2 

Config 

<?xml version = "1.0" encoding = "UTF-8" ?>
<parser 
	xmlns = "http://www.ondex.org/xml/schema/tab_parser"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

	<delimiter>\t</delimiter>
	<quote>"</quote>
	<encoding>UTF-8</encoding>
	<start-line>0</start-line>
		
	<concept id="gene">
		<class>Gene</class>
		<data-source>ENSEMBL</data-source>
		<accession data-source="ENSEMBL-PLANTS">
			<column index='0' />
		</accession>
		<name preferred="true">
			<column index='1' />
		</name>
	</concept>
</parser>

Green: preferred=true ; Black: preferred=false
image

Pubmed parser exception with latest pubmed xml format

Using the pubmed parser in ondex-mini throws this exception:

org.codehaus.stax2.typed.TypedXMLStreamException: ParseError at [row,col]:[696,43] Message: Element content can not contain child START_ELEMENT when using Typed Access methods at com.ctc.wstx.sr.BasicStreamReader._constructTypeException(BasicStreamReader.java:5475) at com.ctc.wstx.sr.BasicStreamReader._constructUnexpectedInTyped(BasicStreamReader.java:5468) at com.ctc.wstx.sr.BasicStreamReader.getElementText(BasicStreamReader.java:705) at net.sourceforge.ondex.parser.medline2.xml.XMLParser.parseMedlineCitation(XMLParser.java:282) at net.sourceforge.ondex.parser.medline2.xml.XMLParser.parse(XMLParser.java:246) at net.sourceforge.ondex.parser.medline2.xml.XMLParser.parseMedlineXML(XMLParser.java:131) at net.sourceforge.ondex.parser.medline2.Parser.start(Parser.java:101) at net.sourceforge.ondex.workflow.engine.Engine.runParser(Engine.java:433) at net.sourceforge.ondex.workflow.engine.PluginProcessor$5.run(PluginProcessor.java:135) at net.sourceforge.ondex.workflow.engine.PluginProcessor$5.run(PluginProcessor.java:133) at net.sourceforge.ondex.workflow.engine.PluginProcessor.execute(PluginProcessor.java:83) at net.sourceforge.ondex.workflow.engine.BasicJobImpl.run(BasicJobImpl.java:110) at net.sourceforge.ondex.WorkflowMain.main(WorkflowMain.java:216) at net.sourceforge.ondex.OndexMiniMain.main(OndexMiniMain.java:7)

Here's a sample file in the latest pubmed xml format: pubmed_test.zip

Migration to new Nexus, outdated or no-longer available dependencies

While migrating Ondex to our new Nexus, I've discovered a number of Ondex 3rd-party dependencies that:

  • either are very old and cannot be found in any public Maven repository anymore
  • or have never been proper Maven projects, but someone made a Jar in more manual ways (eg, via IDE) and uploaded it in the old Nexus.

In the first case, I tried to find more recent versions or replacements. Some of them worked, but we need entensive testing of the new build. In particular, we need to re-run relevant Mini workflows (ara, wheat, etc) and see if the resulting OXL is fine.

In the second case (and in cases where no version or replacement was available), I had to disable modules that depends on those missing components. These are:

Ondex Module ID Module Name URL Lost Deps
nclondexexpression NCL Ondex Expression https://github.com/Rothamsted/ondex-opt/tree/master/modules-opt/expression de.mpg.mpiinf.csb:KPM
psimi2ondex PSI-MI 2.5 parser for Ondex https://github.com/Rothamsted/ondex-opt/tree/master/modules-opt/psimi25 uk.ac.ncl.cs:psimi
sbml sbml https://github.com/Rothamsted/ondex-opt/tree/master/modules-opt/sbml org.biojava:biojava:1.0

We need to confirm that the above modules aren't needed anymore. Or to discuss a solution.

TAB Parser behaviour for blank entries in a column

The below TAB parser snippet currently creates an "empty" concept even for blank entries in a given column. The desired behaviour would be to ignore blank entries.

	<concept id = "gene">
		<class>Gene</class>
		<data-source>ARAGWAS</data-source>
		<accession data-source="TAIR">
			<column index='1'/>
		</accession>
	</concept>

Accesion based mapper fails with OutOfMemoryError

Out of memory error occurs.

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
	at java.lang.Class.getInterfaces(Class.java:856)
	at java.lang.Class.getGenericInterfaces(Class.java:913)
	at java.util.HashMap.comparableClassFor(HashMap.java:351)
	at java.util.HashMap$TreeNode.find(HashMap.java:1874)
	at java.util.HashMap$TreeNode.getTreeNode(HashMap.java:1889)
	at java.util.HashMap.getNode(HashMap.java:576)
	at java.util.HashMap.get(HashMap.java:557)
	at net.sourceforge.ondex.core.memory.MemoryONDEXGraph.storeRelation(MemoryONDEXGraph.java:400)
	at net.sourceforge.ondex.core.base.AbstractONDEXGraph.createRelation(AbstractONDEXGraph.java:191)
	at net.sourceforge.ondex.core.EntityFactory.createRelation(EntityFactory.java:242)
	at net.sourceforge.ondex.mapping.lowmemoryaccessionbased.Mapping.createRelation(Mapping.java:503)
	at net.sourceforge.ondex.mapping.lowmemoryaccessionbased.Mapping.createRelationsOnResults(Mapping.java:395)
	at net.sourceforge.ondex.mapping.lowmemoryaccessionbased.Mapping.start(Mapping.java:250)
	at net.sourceforge.ondex.workflow.engine.Engine.runMapping(Engine.java:396)
	at net.sourceforge.ondex.workflow.engine.PluginProcessor$4.run(PluginProcessor.java:128)
	at net.sourceforge.ondex.workflow.engine.PluginProcessor$4.run(PluginProcessor.java:126)
	at net.sourceforge.ondex.workflow.engine.PluginProcessor.execute(PluginProcessor.java:83)
	at net.sourceforge.ondex.workflow.engine.BasicJobImpl.run(BasicJobImpl.java:110)
	at net.sourceforge.ondex.WorkflowMain.main(WorkflowMain.java:216)
	at net.sourceforge.ondex.OndexMiniMain.main(OndexMiniMain.java:7)

Test workflow and data available under knetminer/test/mapping_bug/git_issue_30/

The input OMA data might have malformed accession datasources or ids.

Textmining Mapping

Create textmining relations with homolog proteins instead of actual species.
e.g. Human Disease -> cooccur_with relation to Mouse homolog and not Human protein.

Specification for an offline Graph Traverser and Semantic Motif Initialiser

The Semantic Motif Initialiser

Summary

Introduction

The KnetMiner Gene Explorer is based on knowledge graphs, that is, datasets that are created and
managed by means of our KnetBuilder framework, also named Ondex. This framework has two major component types:

  • a set core components that allow for dealing with knowledge graphs (details below). Namely,
    ONDEXGraph allows for keeping in RAM a graph of ONDEXConcept(s) (ie, nodes), linked together by
    binary Relation(s) (ie, edges). Concepts and relations have a set of properties, such as their data
    source or a list of key/value attributes.
  • a plug-in system, which can be used to define and run data workflows to read various data sources (eg,
    CSV tables, XML files, web APIs in JSON format) and translate these data into the above graph
    components. The typical workflow starts with initialising an empty graph, then multiple data parser/loader
    plug-ins populate the graph, finally the graph is saved from memory to an OXL file (ie, an XML
    format based on our own schema, which reflects the graph components above). OXL files are then loaded
    into the KnetMiner web app (using an OXL's parser), to serve the application functionality.

In addition to loading a (configured) OXL, the web app does much additional initialisation work, which, mostly consist of:

  • A Lucene-based index is created on-disk to ease keyword-based searches over the OXL graph elements
    (eg, searching nodes by name or identifier)
  • A graph traversal step, which employs semantic motifs, ie, graph
    patterns, to navigate graph paths from genes until relevant entities. Details can be found here.

As said above, currently, both the Lucene indexing and the traverser are invoked against a given dataset when the KnetMiner web application is started, ie, when its Docker container is started, which triggers the start of its Tomcat server, which starts the API/WS .war application (see the KnetMiner wiki for
details).

After the traversal stage, The traverser output is saved on disk and the web application avoids to redo the
whole operation again at each restart, if these output files are found on a configured location. This is
possible because the result of the traversal operation is always the same for a given dataset/graph, and the
web application uses these data in read-only mode. Similarly, the Lucene indexing is skipped if the
corresponding Lucene directory is found under a configured path.

Despite the latter optimisations, the web application spends a lot of time into this initialisation stage, which
could be moved offline, so that we could be able to create traversal data once for all, during the creation of
the dataset by means of the KnetBuilder workflow system (aka, Ondex Mini).

So, the purpose of this document is moving the traversal-invoking code that currently is inside the
KnetMiner web service to KnetBuilder, by developing proper wrappers to invoke it from the KnetBuilder
framework (details below).

Some details about the traversing

This is to get a better understanding of the context for this hereby task, not strictly needed here.
Technically, we have a generic GraphTraverser interface and a (still) default implementation,
which is based on the state machine model. Recently, we have started migrating to a
Cypher-based implementation, which relies on both on in-memory data encoded via Ondex
components and on the same data stored in a Neo4j database. Which traverser flavour to use is
decided via KnetMiner configuration.

Requirements

We need a component based on the architecture of many Ondex plug-ins, that is:

  • A core component, containing the functionality to invoke the traverser. This should contain the bare
    minimum to execute this functionality, possibly, other components should stay elsewhere.
  • An Ondex plug-in wrapper, which defines the available options for the traverser (arguments,
    in the jargon of the Ondex plug-ins), and invokes the core component above. This will be used in
    Ondex Mini workflow, presumably with a graph that was build by previous steps (ie, other plug-ins) in
    a workflow.
  • A command-line (CLI) interface, which is another wrapper to the core. This should load an OXL file
    from CLI parameters and then pass it to the core traverser component above.

For the moment do not create a direct dependency on the Cypher traverser artifact, the component should allow for the choice of this specific traverser (or the default) by means of a string
representing its FQN. We'll look at how to organise this dependency later (eg, optional download in the
workflow binary).

A good (and recent) reference for the architecture outlined above is the graph descriptor component. In particular, note the details:

  • the core component (tests and usage examples). The shape of the new traversal
    component needs to be agreed, eg, SemanticMotifInitializer plus a method like init()
    (note I use American spelling when naming code units).
  • the plug-in. The new plug-in should subclass ONDEXExport, since this is the one closest
    to the meaning of the component at issue. Its implementation won't be much different than anyway the
    descriptor example anyway.
  • the CLI interface
    • Note that recently we started using the picocli library, which is one of
      the best around.
      • Also, note that the CLI component is a separated Maven project, since this has to include
        much stuff that isn't needed in the core package.
      • Moreover, see the CLI POM and the Maven Assembly descriptor file for a
        reference on how to organise the build of the final command line tool binary
        (this is a a CLI package containing multiple tools/commands, not just the graph descriptor tool).
        The two components spawns a .zip that, among other files, contains the /lib directory
        with all the needed runtime .jars, and one or more .sh wrappers to invoke the
        corresponding CLI class (copy-paste from oxl-descriptor.sh for the new .sh).
        See here for info on how these Ondex clients are arranged.

The KnetMiner code

What the new component has to do can be seen (and widely copy-pasted) from the current KnetMiner
code. Namely:

  • Current entry point it OndexServiceProvider.initData( <path> )
  • This loads all application an traverser options from the (XML) property file it gets passed. This path will
    be a parameter for the new component (see below).
  • After the options loading, DataService.initGraph() is invoked. This loads the OXL dataset in
    memory, in an ONDEXGraph field. In the new component, this graph will be a class field (see below).
    • See the loadGraph() code to get an idea of how Parser.loadOXL() is used for this.
    • UIUtils.removeOldGraphAttributes ( graph ) is a KnetMiner-specific operation, not relevant here.
      • The init of genomeGenesCount is instead needed (see below), so the new component will
        need to do this, reusing the current code.
  • The, SearchService.indexOndexGraph() is invoked. This creates a Lucene index of many
    parts of the OXL graph, which is then used by KnetMiner to perform fast keyword-based searches.
    The new component needs to do the same. As you can see, this method gets info from the graph field
    and the data path defined in the options file.
  • After the indexing, we have semanticMotifDataService.initSemanticMotifData ().
    This initialises the traverser, using options above, and then invokes it. After that, results are saved into
    files, in the form of serialised Java objects. We need to replicate/move all the code you see in this
    method.
    • We also need to support the doReset flag. Best choice I see for this is to replicate the same public
      initSemanticMotifData( doReset ) method in the main class SemanticMotifInitializer
      for the new component. This because KnetMiner has a CypherDebugger component,
      used for testing and debugging purposes, which needs to trigger the data reinitialisation
      from this step only.
  • Finally, we have exportService.exportGraphStats(), which saves an XML file of statistics,
    obtained from both the OXL and the traversal results (which are used for visualisations
    like this). This has to be replicated to the new component too.

The initialiser options

The new component needs the same options/parameters that KnetMiner uses in the code described in the previous section. So, our new SemanticMotifInitializer will have this:

  • The ONDEXGraph to work with. Simplest solution is to make the component stateful and
    mantain a graph field for this, together with other stuff (eg, genomeGenesCount
    mentioned above).
  • The path to an options file. This contains several details needed to run the traverser (and KnetMiner),
    some are generic, some are traverser-specific. See an example in this template. In the core
    component, this will be a parameter of the init() method. In the plug-in, this will be a an argument of
    type FileArgument.
    • In the core component, define the init() implementation as a private bare method, accepting the
      parameter options of type OptionsMap. Then define the public wrapper using the option's file path.
  • The input OXL to work with. In the core component, this is a parameter of type OndexGraph.
    The plug-in has already the graph field for this, so no other addition is needed. In the case
    of the CLI, this should be the -i/--oxl option. This should be an optional parameter, which, when
    defined, should override the DataFile option, found in the options file.
  • The path of the output directory. This is where the traverser results have to be stored.
    Similarly to the input path, this should override the DataPath option in the options file.
    In the plug-in, should be a FileArgument (with isDirectory == true) and in the CLI it should
    correspond to the-o/--data-dir option.

Medline parser error

We have not yet managed to narrow it down to the PubMed Id that throws this exception:

https://github.com/Rothamsted/ondex-knet-builder/blob/4d8e129386e2f9340beb9f9bfaad1028ecf0f224/modules/textmining/src/main/java/net/sourceforge/ondex/parser/medline2/xml/XMLParser.java#L443

2019-06-13 09:56:57,133 [main] DEBUG net.sourceforge.ondex.parser.medline2.Parser - Error: PubMed/MEDLINE import did not finish! String ']]>' not allowed in textual content, except as the end marker of CDATA section at [row,col {unknown-source}]: [36442,570] [CLASS:net.sourceforge.ondex.parser.medline2.Parser - METHOD:start LINE:169] com.ctc.wstx.exc.WstxParsingException: String ']]>' not allowed in textual content, except as the end marker of CDATA section at [row,col {unknown-source}]: [36442,570] at com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:612) at com.ctc.wstx.sr.StreamScanner.throwWfcException(StreamScanner.java:461) at com.ctc.wstx.sr.BasicStreamReader.readTextPrimary(BasicStreamReader.java:4544) at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2842) at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1048) at com.ctc.wstx.sr.BasicStreamReader.getElementText(BasicStreamReader.java:653) at net.sourceforge.ondex.parser.medline2.xml.XMLParser.parseAbstract(XMLParser.java:443) at net.sourceforge.ondex.parser.medline2.xml.XMLParser.parseMedlineCitation(XMLParser.java:324) at net.sourceforge.ondex.parser.medline2.xml.XMLParser.parse(XMLParser.java:278) at net.sourceforge.ondex.parser.medline2.xml.XMLParser.lambda$parsePummedID$0(XMLParser.java:225) at uk.ac.ebi.utils.runcontrol.MultipleAttemptsExecutor.executeChecked(MultipleAttemptsExecutor.java:90) at net.sourceforge.ondex.parser.medline2.xml.XMLParser.parsePummedID(XMLParser.java:216) at net.sourceforge.ondex.parser.medline2.Parser.start(Parser.java:151) at net.sourceforge.ondex.workflow.engine.Engine.runParser(Engine.java:422) at net.sourceforge.ondex.workflow.engine.PluginProcessor$5.run(PluginProcessor.java:135) at net.sourceforge.ondex.workflow.engine.PluginProcessor$5.run(PluginProcessor.java:133) at net.sourceforge.ondex.workflow.engine.PluginProcessor.execute(PluginProcessor.java:83) at net.sourceforge.ondex.workflow.engine.BasicJobImpl.run(BasicJobImpl.java:110) at net.sourceforge.ondex.WorkflowMain.main(WorkflowMain.java:216) at net.sourceforge.ondex.OndexMiniMain.main(OndexMiniMain.java:7) 2019-06-13 09:56:57,137 [main] DEBUG net.sourceforge.ondex.workflow.engine.Engine - Medline/PubMed took 903 seconds [CLASS:net.sourceforge.ondex.workflow.engine.Engine - METHOD:runParser LINE:424]

Migration to Java 17

We've almost completed this, adding this issue keep track of the introduced changes, and keeping the issue opened until the migration is finalised.

Essentially, we can't merge this into master right now, since Neo4j isn't compatible with Java 17. For now, I've disabled a number of Neo4j-related Ondex components, just to work with the rest and ensure it can be built and run under J17.

Notes on this on comments below.

LuceneEnv, concept/relation queries that fetch internal metadata too

We have an unfortunate case, where the text mining mapper issues this query to the Lucene component, which shows up with the error:

Internal error: for some reason I have a null ID for the Lucene field: "ConceptID" and the query "(ConceptAttribute_AbstractHeader:abstract)^2.0 (ConceptAttribute_Abstract:abstract)^1.0"

This happens while performing searchScoredEntity() in LuceneEnv, which is invoked by various other methods that search for either concepts or relations.

The search is supposed to fetch documents about Ondex concepts (same would happen for relations), but, given the particular value it looks for, it also gets internal metadata that are used to store information like the list of attributes that a graph uses (see addMetaDataToIndex() in LuceneEnv). These documents don't contain a ConceptID, as the invoker expects and hence, we have the error above.

It can be fixed in three ways:

  1. filter the results that searchScoredEntity() collects from Lucene, ensuring that the Lucene documents it receives do have the requester field
  2. add some meta-field like type:=Concept to concept documents (same for relations) and use it for searches
  3. constrain the query received by searchScoredEntity(), by adding that the field (ie, ConceptID or RelationID parameter must exist in the searched Lucene doc, but this is available in Lucene 7 only (see here).

For the moment, we're choosing the first option, since it's the quicker one to implement.

All of the above applies to searchEntity() as well (does the same search, but ignores the scoring).

Extend tmbased plugin with words to exclude from search

The tmbased mapping plugin can be extended with a new file parameter which contains words that should be excluded from the text mining search. For example, the file could contain a list of bad gene names such as ACT, INC, SUB, MAX etc (one name per line).

The code is here: https://github.com/Rothamsted/knetbuilder/blob/master/ondex-knet-builder/modules/textmining/src/main/java/net/sourceforge/ondex/mapping/tmbased/Mapping.java

Can be implemented as simple if(conceptName==STOPWORD) continue; or we can look into Lucene StopFilter https://lucene.apache.org/core/8_0_0/analyzers-common/org/apache/lucene/analysis/core/StopFilter.html. @marco-brandizi please advice before we start implementing.

        <Mapping name="tmbased">
            <Arg name="OnlyPreferredNames">true</Arg>   
            <Arg name="UseFullText">false</Arg>
            <Arg name="Search">exact</Arg>
            <Arg name="graphId">default</Arg>
            **<Arg name="geneNameStopWords">/path/to/file.txt</Arg>** <!-- eg List of gene names to exclude -->
            <Arg name="ConceptClass">Gene</Arg>
            <Arg name="ConceptClass">Trait</Arg>
        </Mapping>

UniProt parser: Parse GO class and remove GO file parameter

The GO file parameter in the UniProt parser was used to lookup the ontology class P, F or C for each GO annotation in order to create the correct Concept Class and Relation Type. The ontology class information is now included in the UniProt XML itself and therefore the additional GO file is not needed any longer.

I suggest we improve the Parser code to parse F, P or C flags in UniProt XML GO annotations...

<dbReference type="GO" id="GO:0004497">
    <property type="term" value="F:monooxygenase activity"/>
    <property type="evidence" value="ECO:0000501"/>
    <property type="project" value="UniProtKB-KW"/>
 </dbReference>

Text-mining occ_in/cooc_wi relations

In the Rice network, the gene OS04G0350700 (An-1) has a network of around 15200 concepts and is too big to look into on KnetMiner. (OS04G0350700.zip)

It’s connected to 62 TO terms via text-mining including submergence sensitivity. Text-mining found occ_in relations to 14700 publications. Some of the publications are linked as An-1 occurs in chemical names (e.g. butan-1-ol) or they are linked as an1 in the publication within words (e.g. BRRI hybrid dhan1, var. CPAN1676).

cooc_wi relations TO term 'endosperm quality' has a synonym 'end' (e.g. 5'end in publications)

Accession based mapper fails with NullPointerException

The following error is met:

Error: Could not open and parse the workflow file. See stack trace for details.
Expanded workflow can be found at: /tmp/ontologies.xml1459162435658455958expanded
java.lang.NullPointerException: Query must not be null
        at java.util.Objects.requireNonNull(Objects.java:228)
        at org.apache.lucene.search.BooleanClause.<init>(BooleanClause.java:60)
        at org.apache.lucene.search.BooleanQuery$Builder.add(BooleanQuery.java:138)
        at net.sourceforge.ondex.core.searchable.LuceneQueryBuilder.searchConceptByConceptAccessionExact(LuceneQueryBuilder.java:607)
        at net.sourceforge.ondex.core.searchable.LuceneQueryBuilder.searchConceptByConceptAccessionExact(LuceneQueryBuilder.java:563)
        at net.sourceforge.ondex.mapping.lowmemoryaccessionbased.Mapping.start(Mapping.java:239)
        at net.sourceforge.ondex.workflow.engine.Engine.runMapping(Engine.java:396)
        at net.sourceforge.ondex.workflow.engine.PluginProcessor$4.run(PluginProcessor.java:128)
        at net.sourceforge.ondex.workflow.engine.PluginProcessor$4.run(PluginProcessor.java:126)
        at net.sourceforge.ondex.workflow.engine.PluginProcessor.execute(PluginProcessor.java:83)
        at net.sourceforge.ondex.workflow.engine.BasicJobImpl.run(BasicJobImpl.java:110)
        at net.sourceforge.ondex.WorkflowMain.main(WorkflowMain.java:216)
        at net.sourceforge.ondex.OndexMiniMain.main(OndexMiniMain.java:7)

This is using ondex mini 3.0 release and a certain OXL file as input.

Test workflow and data are in the knetminer share under test/mapping_bug/git_issue_29/

ConceptClass Filter is wrong when a relation matches data source restriction but not CC restriction.

Reported by @KeywanHP and just fixed, I'm adding the issue to keep track of it. This is about the operations of the CC-based filter, which removes/keeps concepts and incident relations, based on specified concept class and, optionally, a given data source.

From comments in the code:

// Suppose gene1(DS=FOO) -> (r1) -> protein1(DS=TAIR), CC = Gene
// Neither gene1 nor protein are filtered (gene1 not in DS, protein1 not in CC)
// Yet getRelationsOfDataSource(TAIR) WILL pick r1, due to prot1.DS 

That's because of selectedR.retainAll(graph.getRelationsOfDataSource(dataSource)); (see the filter source) is too broad for the selection that's actually needed. We basically need to retain only the selectedC concepts that were selected by both filtering by CC and then by DS.

There's a test file showing the case (GENE-FOO and its relation should be filtered there, but not the other gene and its relation, despite the fact the latter lands on a concept from TAIR which is not a gene).

The Text Mining plug-in doesn't find unix4j anymore (was: PubMed efetch parsing problem?)

I tried running a knetbuilder release from earlier this month and also with old and new downloads of wheat pubmed.xml files but had the same error message in all tests:
/home/data/knetminer/etl-test/plant/126397.err:Exception in thread "main" java.lang.NoClassDefFoundError: org/unix4j/builder/To
/home/data/knetminer/etl-test/plant/126408.err:Exception in thread "main" java.lang.NoClassDefFoundError: org/unix4j/builder/To

Keywan wondered if NCBI efetch downloads have changed and broken knetbuilder XML parsing?

[Yesterday 23:45] Keywan Hassani-Pak
publicstaticStringEFETCH_WS="https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&retmode=xml&id=";
​[Yesterday 23:45] Keywan Hassani-Pak


knetbuilder/XMLParser.java at b8971b5 · Rothamsted/knetbuilder
KnetBuilder data integration platform for building knowledge graphs. Previously known as ondex. - knetbuilder/XMLParser.java at b8971b5 · Rothamsted/knetbuilder
github.com

Exception in thread "main" java.lang.NoClassDefFoundError: org/unix4j/builder/To
        at net.sourceforge.ondex.parser.medline2.xml.XMLParser.parseMedlineXML(XMLParser.java:118)
        at net.sourceforge.ondex.parser.medline2.xml.XMLParser.parseMedlineXML(XMLParser.java:152)
        at net.sourceforge.ondex.parser.medline2.Parser.start(Parser.java:101)

Error: org/apache/log4j/PropertyConfigurator

I do have a java version 17 on my Windows 10 workstation which has all minimum configuration requirements to install ondex GUI. But I am receiving the above-mentioned error, even after trying different system compatibilities.
How can I encounter it?

Script needed to run Ondex KnetBuilder GUI

In addition to the existing .sh and .bat for the Ondex KnetBuilder CLI....

Users should be able to run the Ondex Integrator GUI from the ondex-knet-builder release.

I suppose we can create .sh and .bat scripts for the GUI version as well and make sure it recognizes all plugins from the plugins/ folder?

Remove dependabot warnings about Apache Axis

See Here.

The warnings about Apache Axis are all related to the Kegg module, in modules/opt/. This module was removed. Once we confirm that no deployment around is actually using it anymore, we can remove the corresponding warnings above.

NullPointerException when searching for a particular set of terms

Happening with babvs73, wheat instance, with our without a gene list. From the code, should be about concepts without a name attached, will fix it with a check/default.

20210421-14:37:25.398 [http-nio-8080-exec-10] ANALYTICS analytics-log - {datasource=wheatknet-beta, host=babvs73.rothamsted.ac.uk, keywords="growth" OR "cell division" OR "cell proliferation" OR "inflorescence" OR "carbohydrate metabolism" OR "photosynthesis" OR "grain number" OR "grain weight" OR "grain hardness" OR "spikelets" OR "tillers" OR "vernalization" OR "vernalisation" OR "Plant photoperiod response", list=["TraesCS3A02G245000","TraesCS3B02G275000","TraesCS3D02G246500","TraesCS3D02G401400","TraesCS3B02G439900","TraesCS3A02G406200","TraesCS4D02G040400","TraesCS4A02G271000","TraesCS4A02G466700","TraesCS4B02G043100","TraesCS2A02G116900","TraesCS2B02G136100","TraesCS2D02G118200","TraesCS2A02G081900","TraesCSU02G196100","TraesCS2D02G079600","TraesCS5D02G245300","TraesCS5A02G238400","TraesCS5B02G236900"], mode=genome, port=9100, qtl=[]}
20210421-14:37:25.717 [http-nio-8080-exec-10] INFO  OndexLocalDataSource - Number of user provided genes: 19
20210421-14:37:25.717 [http-nio-8080-exec-10] INFO  OndexLocalDataSource - Search mode: rres.knetminer.datasource.api.GenomeResponse
20210421-14:37:26.360 [http-nio-8080-exec-10] INFO  SearchService - searchLucene(), keywords: ""growth" OR "cell division" OR "cell proliferation" OR "inflorescence" OR "carbohydrate metabolism" OR "photosynthesis" OR "grain number" OR "grain weight" OR "grain hardness" OR "spikelets" OR "tillers" OR "vernalization" OR "vernalisation" OR "Plant photoperiod response"", returning 11512 total hits
20210421-14:37:26.360 [http-nio-8080-exec-10] INFO  Hits - Matching Lucene concepts: 11512
20210421-14:37:26.806 [http-nio-8080-exec-10] INFO  Hits - Matching unique genes: 79324
20210421-14:37:26.806 [http-nio-8080-exec-10] INFO  OndexLocalDataSource - Genome or QTL response...
20210421-14:37:26.806 [http-nio-8080-exec-10] INFO  SearchService - Total hits from lucene: 11512
20210421-14:37:38.115 [http-nio-8080-exec-10] INFO  OndexLocalDataSource - Number of genes: 79324
20210421-14:37:39.507 [http-nio-8080-exec-10] INFO  OndexLocalDataSource - Using user gene list, genes: 19
20210421-14:37:39.507 [http-nio-8080-exec-10] INFO  ExportService - Genomaps: generating XML...
20210421-14:37:39.508 [http-nio-8080-exec-10] INFO  SearchService - QTL search query: +ConceptClass:Trait +(ConceptName:growth ConceptName:"cell division" ConceptName:"cell proliferation" ConceptName:inflorescence ConceptName:"carbohydrate metabolism" ConceptName:photosynthesis ConceptName:"grain number" ConceptName:"grain weight" ConceptName:"grain hardness" ConceptName:spikelets ConceptName:tillers ConceptName:vernalization ConceptName:vernalisation ConceptName:"plant photoperiod response")
20210421-14:37:39.514 [http-nio-8080-exec-10] ERROR KnetminerExceptionHandler - Returning exception from web request processing, HTTP status: '500 INTERNAL_SERVER_ERROR'
java.lang.RuntimeException: Application error while running genome: null
	at rres.knetminer.datasource.server.KnetminerServer._handle(KnetminerServer.java:388) ~[classes/:?]
	at rres.knetminer.datasource.server.KnetminerServer.handle(KnetminerServer.java:328) ~[classes/:?]
	at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
	at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
	at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
	at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.1.jar:5.3.1]
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.1.jar:5.3.1]
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.1.jar:5.3.1]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:893) ~[spring-webmvc-5.3.1.jar:5.3.1]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:807) ~[spring-webmvc-5.3.1.jar:5.3.1]
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.1.jar:5.3.1]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) [spring-webmvc-5.3.1.jar:5.3.1]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) [spring-webmvc-5.3.1.jar:5.3.1]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) [spring-webmvc-5.3.1.jar:5.3.1]
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) [spring-webmvc-5.3.1.jar:5.3.1]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) [servlet-api.jar:4.0.FR]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) [spring-webmvc-5.3.1.jar:5.3.1]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) [servlet-api.jar:4.0.FR]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [catalina.jar:9.0.41]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.41]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) [tomcat-websocket.jar:9.0.41]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.41]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.41]
	at org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71) [log4j-web-2.14.0.jar:2.14.0]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.41]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.41]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) [catalina.jar:9.0.41]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) [catalina.jar:9.0.41]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) [catalina.jar:9.0.41]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) [catalina.jar:9.0.41]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [catalina.jar:9.0.41]
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690) [catalina.jar:9.0.41]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) [catalina.jar:9.0.41]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [catalina.jar:9.0.41]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) [tomcat-coyote.jar:9.0.41]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-coyote.jar:9.0.41]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) [tomcat-coyote.jar:9.0.41]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) [tomcat-coyote.jar:9.0.41]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:9.0.41]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:9.0.41]
	at java.lang.Thread.run(Thread.java:834) [?:?]
Caused by: java.lang.reflect.InvocationTargetException
	at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
	at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
	at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
	at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
	at rres.knetminer.datasource.server.KnetminerServer._handle(KnetminerServer.java:375) ~[classes/:?]
	... 43 more
Caused by: java.lang.NullPointerException
	at rres.knetminer.datasource.ondexlocal.service.SearchService.searchQTLsForTrait(SearchService.java:393) ~[server-datasource-ondexlocal-5.0-SNAPSHOT.jar:?]
	at rres.knetminer.datasource.ondexlocal.service.SearchService.searchQTLs(SearchService.java:457) ~[server-datasource-ondexlocal-5.0-SNAPSHOT.jar:?]
	at rres.knetminer.datasource.ondexlocal.service.ExportService.exportGenomapXML(ExportService.java:551) ~[server-datasource-ondexlocal-5.0-SNAPSHOT.jar:?]
	at rres.knetminer.datasource.ondexlocal.OndexLocalDataSource._keyword(OndexLocalDataSource.java:240) ~[server-datasource-ondexlocal-5.0-SNAPSHOT.jar:?]
	at rres.knetminer.datasource.ondexlocal.OndexLocalDataSource.genome(OndexLocalDataSource.java:164) ~[server-datasource-ondexlocal-5.0-SNAPSHOT.jar:?]
	at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
	at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
	at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
	at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
	at rres.knetminer.datasource.server.KnetminerServer._handle(KnetminerServer.java:375) ~[classes/:?]
	... 43 more

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.