【问题标题】:Neo4j Avoiding circular results in cypher queryNeo4j 在密码查询中避免循环结果
【发布时间】:2023-03-04 16:36:01
【问题描述】:

我将统一医学语言系统 (UMLS) 本体加载到 Neo4j 中,以及 SNOMED 概念节点之间的关系。任何两个节点之间可以有多种类型的关系。 UMLS 的 2015AA 版本和我选择的选项产生了 1,256,982 个 SNOMED 节点和它们之间的 2,258,642 个关系。此查询会产生 SNOMED 根节点的预期 21 个子节点:

MATCH (n:MRCONSO{AUI:'A3684559'}) match n<-[*..1]-x return count(*)

增加查询的深度会导致问题。此查询在返回中产生 3338 行

MATCH (n:MRCONSO{AUI:'A3684559'}) match n<-[*..2]-x return id(x)

有 11 行的 id 不是唯一的。这也可以在这个查询中看到,它产生 3327 行 (3338-11)

MATCH (n:MRCONSO{AUI:'A3684559'}) match p=shortestpath(n<-[*..2]-x) return id(x)

因此,我可以使用最短路径获取唯一的子节点 ID。但是,第二次和第三次查询的查询时间分别为 52 毫秒和 61745 毫秒。这些中的任何一个都会随着更深入的查询而恶化。

有没有办法避免查询中的循环,从而减少查询时间?

【问题讨论】:

    标签: neo4j cypher ontology


    【解决方案1】:

    您使用的是哪个版本的 Neo4j?尝试更新到 2.2.2

    您是否能够确定为什么会得到这些重复的 ID? 一个孩子可能在两个层面上都可以接触到

    您的查询还将输出 1 级和 2 级子级。

    可以输出某个重复id的所有路径吗?

    仅仅获得唯一的 id 就足够了吗?然后你可以使用 distinct。

    MATCH (n:MRCONSO{AUI:'A3684559'})
    MATCH (n)<-[*..2]-(x) 
    RETURN distinct id(x)
    

    您对:MRCONSO(AUI) 有索引或约束吗?

    【讨论】:

    • 我使用的是 2.3.0-M01 版本。 AUI上有一个索引。使用不同的 id(x) 确实可以显着加快查询速度。但是,它并没有解决循环的根本问题。而且,我需要的不仅仅是节点 ID,因为基本目标是输出节点之间的语义含义和关系类型(UMLS 概念)。
    • 您是否检查了重复项的路径。 Cypher 在单条路径上使用关系唯一性,但不在多条路径上使用。所以它永远不会返回循环路径,但多条路径可以通向同一个端节点。
    • 我想你已经抓住了问题的本质。通过重复,我认为您的意思是相同的节点出现在单个路径中。通过手动检查输出,我可以看到这种情况正在发生。我如何在密码中解决这个问题?我试过 MATCH path = (n:MRCONSO{AUI:'A3684559'})
    • 该查询返回了多少条路径? MATCH path = (n:MRCONSO{AUI:'A3684559'})
    • 好问题。 30,488。此查询将您从 SNOMED 本体的根部带到每一片叶子。并且一些后代节点有多个路径。所以......也许是路径数量和循环性的组合使这个问题变得困难。使用路径方法消除重复节点适用于有限数量的路径,但这不是这里的场景。这一定是其他网络的问题,比如社交网络?在将关系加载到 Neo4j 之前,也许有一些预处理步骤来解决这个问题?
    猜你喜欢
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 2015-12-02
    • 2022-11-25
    • 2011-05-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多