Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion server/catgenome/profiles/dev/catgenome.properties
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ llm.openai.api.key=${NGB_OPEN_AI_KEY:}

llm.openai.chatgpt35.prompt.template=Generate brief gene summary as drug target based on the following articles:
llm.openai.chatgpt35.first.message.prefix=Consider the following article abstracts:
llm.openai.chatgpt35.last.message.prefix=Based on previously provided articles
llm.openai.chatgpt35.last.message.prefix=Based on previously provided articles. Share links when mentioning articles.

llm.openai.chatgpt40.prompt.template=Generate brief gene summary as drug target based on the following articles:
llm.openai.chatgpt40.first.message.prefix=Consider the following article abstracts:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -286,8 +286,9 @@ public Result<SearchResult<NCBISummaryVO>> getPublications(@RequestBody final Pu
@ApiResponses(
value = {@ApiResponse(code = HTTP_STATUS_OK, message = API_STATUS_DESCRIPTION)
})
public Result<String> getAbstracts(@RequestBody final PublicationSearchRequest request) {
return Result.success(launchIdentificationSecurityService.getArticleAbstracts(request));
public Result<String> getAbstracts(@RequestBody final PublicationSearchRequest request,
@RequestParam(required = false, defaultValue = "false") boolean getLinks) {
return Result.success(launchIdentificationSecurityService.getArticleAbstracts(request, getLinks));
}

@GetMapping(value = "/target/sequences")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
Expand Down Expand Up @@ -70,6 +71,7 @@ public class PubMedService {
private Integer articlesMaxNumber;

private static final Integer BATCH_SIZE = 500;
private static final String ARTICLE_XPATH = "MedlineCitation//Article";

private final NCBIGeneIdsManager ncbiGeneIdsManager;
private final NCBIGeneManager ncbiGeneManager;
Expand Down Expand Up @@ -115,21 +117,21 @@ public int getPublicationsCount(final List<String> entrezIds) {
}

@SneakyThrows
public String getArticleAbstracts(final List<String> pmcIds) {
public String getArticleAbstracts(final List<String> pmcIds, boolean getLinks) {
final String xml = ncbiDataManager.fetchXmlById(NCBIDatabase.PUBMED.name(),
String.join(",", pmcIds), "Abstract");
return parseAbstract(xml);
return getLinks ? parseAbstractWithLink(xml) : parseAbstract(xml);
}

public String getArticleAbstracts(final PublicationSearchRequest request) {
public String getArticleAbstracts(final PublicationSearchRequest request, boolean getLinks) {
request.setPage(1);
request.setPageSize(articlesMaxNumber);
final SearchResult<NCBISummaryVO> result = fetchPubMedArticles(request);
final List<String> ids = ListUtils.emptyIfNull(result.getItems())
.stream()
.map(NCBISummaryVO::getUid)
.collect(Collectors.toList());
return getArticleAbstracts(ids);
return getArticleAbstracts(ids, getLinks);
}

private String parseAbstract(final String xml) throws ParserConfigurationException, IOException,
Expand All @@ -150,4 +152,32 @@ private String parseAbstract(final String xml) throws ParserConfigurationExcepti
}
return result.toString();
}

private String parseAbstractWithLink(final String xml) throws ParserConfigurationException, IOException,
SAXException, XPathExpressionException {
final XPath xPath = XPathFactory.newInstance().newXPath();
final DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
final DocumentBuilder builder = builderFactory.newDocumentBuilder();
final InputSource is = new InputSource(new StringReader(xml));
final Document document = builder.parse(is);
final XPathExpression exp = xPath.compile("//PubmedArticle");
final NodeList articles = (NodeList)exp.evaluate(document, XPathConstants.NODESET);
final StringBuilder result = new StringBuilder();
for (int i = 0; i < articles.getLength(); i++) {
if (result.length() != 0) {
result.append('\n');
}
Node item = articles.item(i).cloneNode(true);
String title = xPath.compile(ARTICLE_XPATH + "//ArticleTitle").evaluate(item);
result.append(String.format("Article: \"%s\" ", title));
String id = xPath.compile("MedlineCitation//PMID").evaluate(item);
result.append(String.format("Link: https://pubmed.ncbi.nlm.nih.gov/%s. ", id));
XPathExpression abstractExp = xPath.compile(ARTICLE_XPATH + "//Abstract//AbstractText");
NodeList abstracts = (NodeList)abstractExp.evaluate(item, XPathConstants.NODESET);
for (int j = 0; j < abstracts.getLength(); j++) {
result.append(abstracts.item(j).getTextContent());
}
}
return result.toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public String getArticleSummary(final List<String> pubMedIDs,
final int maxSize,
final double temperature) {
return getHandler(provider)
.getSummary(pubmedService.getArticleAbstracts(pubMedIDs), temperature);
.getSummary(pubmedService.getArticleAbstracts(pubMedIDs, false), temperature);
}

public String getGeneArticleSummary(final List<String> geneIds,
Expand All @@ -66,7 +66,7 @@ public String getGeneArticleSummary(final List<String> geneIds,
final double temperature) {
final PublicationSearchRequest request = new PublicationSearchRequest();
request.setGeneIds(geneIds);
return getHandler(provider).getSummary(pubmedService.getArticleAbstracts(request), temperature);
return getHandler(provider).getSummary(pubmedService.getArticleAbstracts(request, false), temperature);
}

public String getChatResponse(final List<LLMMessage> messages,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -223,8 +223,8 @@ public SearchResult<NCBISummaryVO> getPublications(final PublicationSearchReques
return pubMedService.fetchPubMedArticles(request);
}

public String getArticlesAbstracts(final PublicationSearchRequest request) {
return pubMedService.getArticleAbstracts(request);
public String getArticlesAbstracts(final PublicationSearchRequest request, boolean getLinks) {
return pubMedService.getArticleAbstracts(request, getLinks);
}

public List<GeneSequences> getGeneSequences(final List<String> geneIds) throws ParseException, IOException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,8 +148,8 @@ public SearchResult<NCBISummaryVO> getPublications(final PublicationSearchReques
}

@PreAuthorize(ROLE_USER)
public String getArticleAbstracts(final PublicationSearchRequest request) {
return manager.getArticlesAbstracts(request);
public String getArticleAbstracts(final PublicationSearchRequest request, boolean getLinks) {
return manager.getArticlesAbstracts(request, getLinks);
}

@PreAuthorize(ROLE_USER)
Expand Down