gpt4 book ai didi

graph - Neo4j Cypher 查询以查找未连接太慢的节点

转载 作者:行者123 更新时间:2023-12-04 12:28:53 25 4
gpt4 key购买 nike

鉴于我们有以下 Neo4j 模式(简化但显示了重点)。有两种类型的节点NODEVERSION . VERSION s 连接到 NODE s 通过 VERSION_OF关系。 VERSION节点确实有两个属性 fromuntil表示有效时间跨度 - 一个或两个都可以是 NULL (在 Neo4j 术语中不存在)表示无限。 NODE s 可以通过 HAS_CHILD 连接关系。同样,这些关系有两个属性 fromuntil表示有效时间跨度 - 一个或两个都可以是 NULL (在 Neo4j 术语中不存在)表示无限。

编辑 : 有效期为VERSION节点和 HAS_CHILD关系是独立的(即使该示例巧合地显示它们是对齐的)。

enter image description here

该示例显示了两个 NODE s 一个 . 一个 有两个 VERSION s AV1 直到 6/30/17 和 AV2 从 7/1/17 开始,同时 只有一个版本 BV1 那是无限的。 已连接到 一个 通过 HAS_CHILD关系直到 6/30/17。

现在的挑战是查询所有不是 的节点的图。 child (即根节点)在某个特定时刻。给定上面的例子,查询应该只返回 如果查询日期是例如6/1/17,但它应该返回 一个 如果查询日期是例如2017 年 8 月 1 日(因为 A 不再是 B 的子代 | 17 年 7 月 1 日)。

今天的当前查询与那个大致相似:

MATCH (n1:NODE)
OPTIONAL MATCH (n1)<-[c]-(n2:NODE), (n2)<-[:VERSION_OF]-(nv2:ITEM_VERSION)
WHERE (c.from <= {date} <= c.until)
AND (nv2.from <= {date} <= nv2.until)
WITH n1 WHERE c IS NULL
MATCH (n1)<-[:VERSION_OF]-(nv1:ITEM_VERSION)
WHERE nv1.from <= {date} <= nv1.until
RETURN n1, nv1
ORDER BY toLower(nv1.title) ASC
SKIP 0 LIMIT 15

这个查询一般来说工作得比较好,但是当在大型数据集上使用时它开始变得很慢(与实际生产数据集相比)。带 20-30k NODE s(大约是 VERSION s 数量的两倍)(真实)查询在运行在 Mac OS X 上的小型 docker 容器上大约需要 500-700 毫秒),这是可以接受的。但是有 1.5M NODE s(大约是 VERSION s 的两倍),(真实)查询在裸机服务器(只运行 Neo4j)上需要 1 分钟多一点的时间。这实在是不能接受。

我们有任何选项可以调整此查询吗?是否有更好的方法来处理 NODE 的版本控制? s(我怀疑是这里的性能问题)还是关系的有效性?我知道关系属性不能被索引,所以可能有更好的模式来处理这些关系的有效性。

非常感谢任何帮助甚至最轻微的提示。

编辑后 answer from Michael Hunger :
  • 根节点百分比:

    对于当前的示例数据集(1.5M 节点),结果集包含大约 2k 行。这不到 1%。
  • ITEM_VERSION第一个节点 MATCH :

    我们正在使用 ITEM_VERSION nv2将结果集过滤为 ITEM没有其他连接的节点 ITEM给定日期的节点。这意味着必须不存在对给定日期有效的关系,或者连接的项目不得具有 ITEM_VERSION这对给定的日期有效。我试图说明这一点:
    // date 6/1/17

    // n1 returned because relationship not valid
    (nv1 ...)->(n1)-[X_HAS_CHILD ...6/30/17]->(n2)<-(nv2 ...)

    // n1 not returned because relationship and connected item n2 valid
    (nv1 ...)->(n1)-[X_HAS_CHILD ...]->(n2)<-(nv2 ...)

    // n1 returned because connected item n2 not valid even though relationship is valid
    (nv1 ...)->(n1)-[X_HAS_CHILD ...]->(n2)<-(nv2 ...6/30/17)
  • 不使用关系类型:

    这里的问题是该软件具有用户定义的架构和 ITEM节点通过自定义关系类型连接。由于我们不能在一个关系上有多个类型/标签,这些关系的唯一共同特征是它们都以 X_ 开头。 .这已被排除在此处的简化示例之外。将使用谓词搜索 type(r) STARTS WITH 'X_'这里有帮助吗?
  • 最佳答案

    您使用的是什么 Neo4j 版本。

    在您的示例日期,您的 150 万个节点中有多少百分比会被发现为根,如果您没有限制,返回多少数据?也许问题不在于比赛,而在于最后的排序?

    我不确定您为什么在第一部分中有 VERSION 节点,至少您没有将它们描述为与确定根节点相关。

    你没有使用关系类型。

    MATCH (n1:NODE) // matches 1.5M nodes
    // has to do 1.5M * degree optional matches
    OPTIONAL MATCH (n1)<-[c:HAS_CHILD]-(n2) WHERE (c.from <= {date} <= c.until)
    WITH n1 WHERE c IS NULL
    // how many root nodes are left?
    // # root nodes * version degree (1..2)
    MATCH (n1)<-[:VERSION_OF]-(nv1:ITEM_VERSION)
    WHERE nv1.from <= {date} <= nv1.until
    // has to sort all those
    WITH n1, nv1, toLower(nv1.title) as title
    RETURN n1, nv1
    ORDER BY title ASC
    SKIP 0 LIMIT 15

    关于graph - Neo4j Cypher 查询以查找未连接太慢的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41300518/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com