gpt4 book ai didi

neo4j - 基于先前关系的密码匹配路径

转载 作者:行者123 更新时间:2023-12-02 03:36:16 26 4
gpt4 key购买 nike

我试图对我的路径匹配模式施加限制。
我想根据之前使用的关系类型匹配下一个关系。

这是一个简化数据库的示例:

(A)-1-(B)-2-(C)-1-(E)-2-(F)
| |
3----(D)----3

查询一:
start n=node(A), m=node(F) 
match p=n-[r*]-m
return p

应该导致两条路径
(A)-1-(B)-2-(C)-1-(E)-2-(F)
(A)-1-(B)-3-(D)-3-(E)-2-(F)

但是,当从节点 (F) 开始运行查询时:
start m=node(F),n=node(A)
match p=m-[r*]-n
return p

结果应该只有:
(F)-2-(E)-1-(C)-2-(B)-1-(A)

小路
(F)-2-(E)-3-(D)-3-(B)-1-(A)

不应该是有效的,因为它违反了这些约束:
  • 来自 -1- 类型的关系,您可以继续进行
    -2- 或 -3- 关系。
  • 来自 -2- 或 -3- 类型的关系,您只能继续
    -1- 关系。

  • 这些路径是有效的:
    ()-1-()-2-()
    ()-1-()-3-()
    ()-2-()-1-()
    ()-3-()-1-()

    这些路径无效:
    ()-3-()-2-()
    ()-2-()-3-()

    最佳答案

    首先,为非常详细、具体且布局合理的问题投票。

    不幸的是,我认为用 Cypher 做你想做的事是不可能的,我认为你需要 Traversal API去做这个。 Cypher 是一种声明性语言;也就是说,你告诉它你想要什么,它就会为你得到它。使用遍历 API 是一种命令式的查询方式;也就是说,你告诉 neo4j 如何遍历图。

    您在此处的查询对遍历关系的顺序以及构成有效路径的条件施加了限制。这没有错,但我相信对遍历顺序施加约束意味着你在告诉 cypher 以哪种方式遍历,而你不能用 cypher 做到这一点,因为它是声明性的。声明式与命令式的另一个常见示例是广度优先与深度优先搜索。如果您正在寻找某些节点,您不能告诉 cypher 遍历广度优先与深度优先;你只需告诉它你想要哪些节点,它就会去获取它们。

    现在,路径可以被视为 collections in cypher via the relationships() function.您可以使用 filterreduce处理个人关系的功能。但是您的查询更难,因为您需要这样的代码:“如果路径中的第一个关系是 1,那么下一个关系必须是 2 或 3”。这正是你可以用 Evaluators 做的事情。在遍历 API 中。检查接口(interface),您可以看到如何编写自己的方法来实现您通过Evaluator#evaluate(Path path) 谈论的逻辑。 .

    作为一般说明,因为声明性查询(密码)对您隐藏了遍历细节,恕我直言,如果您可以以声明方式指定您想要的内容,那么使用声明性查询总是更好。但是在某些情况下,您必须控制遍历的顺序,为此您需要遍历。 (我遇到过我需要所有节点连接到其他东西的情况,仅通过广度优先搜索,最大深度为 3,以及复杂的关系标准——我不能为此使用密码)。

    为了给你一个前进的方向,检查我在遍历框架上提供的链接。也许您可以将您的查询描述为 TraversalDescription ,然后交给 neo4j 运行。

    关于neo4j - 基于先前关系的密码匹配路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23267894/

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