/** * form and apply a parent organ to parts * * @param description: * @param statement * @param parentStructure element holding a candidate parent * @param parentOfParentStructure string of the name of the parent organ of the parentstructure * @return */ private String attachParentOrganToOtherBiologicalEntities( Document document, Element description, Element statement, Element parentStructure, String parentOfParentStructure, String nonSpecificParts) { String parentOrgan = getParentOrgan(document, description, parentStructure, parentOfParentStructure); // parentorgan = parentorgan.trim(); // attach parentorgan to other 'structures' in this statement List<Element> biologicalEntities = statement.getChildren("biological_entity"); // could include 'relation' too String parentStructureName = null; for (Element biologicalEntity : biologicalEntities) { if (!biologicalEntity.equals(parentStructure)) { // skip the 1st structure which is parentstruct if (!hasStructuralConstraint(biologicalEntity)) { String partOfChain = getPartOfChain(document, description, biologicalEntity, 3) .replace(" of ", ",") .trim(); // part of organ of organ String part = biologicalEntity.getAttributeValue("name") + (partOfChain.isEmpty() ? "" : "," + partOfChain); if (part.matches("\\b(" + nonSpecificParts + ")\\b.*") && !part.contains(",") && parentOrgan.equals("whole_organism")) { parentStructureName = hasPart( parentStructure, biologicalEntity, description, parentOrgan, part, nonSpecificParts); if (!parentStructureName.isEmpty()) { log( LogLevel.DEBUG, "===>[part of 1] use '" + parentStructureName + "' as constraint to '" + biologicalEntity.getName() + "'"); appendConstraint(biologicalEntity, formatParentOrgan(parentStructureName)); } else if (possess(parentStructure, biologicalEntity, description)) { parentStructureName = formatParentOrgan(parentOrgan); log( LogLevel.DEBUG, "===>[possess] use '" + parentStructureName + "' as constraint to '" + biologicalEntity.getName() + "'"); appendConstraint(biologicalEntity, formatParentOrgan(parentStructureName)); } } } } } return parentStructureName != null ? parentStructureName : parentOrgan.replaceAll("(^,|,$)", ""); }