【问题标题】:Trouble Excluding Nodes from Graph从图中排除节点时遇到问题
【发布时间】:2015-09-01 01:00:35
【问题描述】:

设置

我对图形数据库和 neo4j/cypher 非常陌生,我很难理解如何从我的结果中排除各种部分。下面是我的图表的图像。每个节点和每个关系都有一个 activeFromactiveTo 属性,让我可以查看历史上任何给定点存在的图形。

MATCH (:Collective:Company)<-[tree *0..4]-(downline:Collective) RETURN downline

(与日期的任何关系都表明它已经或计划(未来日期)到期。没有日期或未来日期意味着它处于活动状态。)。


问题

我在这里的最终目标是查看相同的图表,减去所有过期的节点和关系。现在,我正在尝试构建让我看到的查询并且失败了:(

我不明白为什么:

  1. Region5Company1 的关系仍然活跃……为什么公司没有出现? (不应该像第一张图片那样把公司带回来吗?)
  2. Office5Office27 的关系都已过期,为什么它们仍在结果中?
  3. 办公室 1、2、6、9、11 是活动节点,但没有活动关系,为什么会被退回? (我的猜测是我的第二个WHERE 子句(分支过滤器)正在过滤掉关系,但不是它们关联的节点,但我不确定如何以不同的方式进行)

.

MATCH (:Collective:Company)<-[tree *0..4]-(downline:Collective)
WHERE
    // -- node(s) are active
    downline.activeFrom <= '2015-08-31 23:59:59'
    AND (downline.activeTo IS NULL OR downline.activeTo > '2015-08-31 23:59:59')
UNWIND tree AS branch
WITH branch, downline
WHERE
    // -- branch is active
    branch.activeFrom <= '2015-08-31 23:59:59'
    AND (branch.activeTo IS NULL OR branch.activeTo > '2015-08-31 23:59:59')
RETURN downline

奖金

我已经用这些数据设置了一个 neo4j 沙箱,供你们根据需要使用。 请对此成熟,因为我不知道如何使其只读。请不要去删除数据并为其他人搞砸事情。我也亲自为这个云实例付费,所以请不要滥用虚拟机/资源:)

您可以在此处访问它:(抱歉,出于安全考虑,问题已得到解答,因此已将其删除)。

【问题讨论】:

    标签: database neo4j cypher graph-databases


    【解决方案1】:

    根据您的问题,我正在尝试拼凑您需要的内容,并且我了解您希望返回包含所有活动节点和关系的路径。这是因为您询问过 Office 27 和 Office 5 都是活动节点,但它们与区域 5 的单一关系是非活动的,因此您不希望 Office 27->Region 5 和 Office 5->Region 5 之间的路径.

    然而,Office 2 处于活动状态,并且它与区域 4 具有活动关系(也处于活动状态)。区域 4 与公司 1 具有非活动关系,因此由于您不希望结果中出现 Office 2,我假设这是因为它在整个路径中具有非活动关系?

    如果是这种情况,这里有一个查询,希望能满足您的需求-

    MATCH p=(:Collective:Company)<-[tree*0..4]-(downline:Collective)
    WHERE
      ALL(x in relationships(p) WHERE x.activeFrom <= '2015-08-31 23:59:59'
      AND (x.activeTo IS NULL OR x.activeTo > '2015-08-31 23:59:59'))
      AND ALL(x in nodes(p) WHERE x.activeFrom <= '2015-08-31 23:59:59'
      AND (x.activeTo IS NULL OR x.activeTo > '2015-08-31 23:59:59'))
    RETURN p
    

    这可确保路径中的每个关系和每个节点都处于活动状态。要恢复 Office 2,1,请将 ALL 更改为 ANY,您会在结果中看到这些内容,因为路径现在部分处于活动状态。

    顺便说一句,你也可以在http://console.neo4j.org/?init=0 设置你的图表并分享它

    【讨论】:

    • 哦,这看起来是个不错的答案 :) 感谢有关 neo 控制台的提示 :) 你能帮我理解为什么我写的查询没有达到我的预期吗?
    • 这有点奇怪,因为你想根据路径进行过滤,但是你已经把它分成节点,然后只有关系——如果你做 MATCH (:Collective:Company) '2015-08-31 23:59:59') UNWIND tree AS branch return branch,downline 你会看到在 WITH 之后传递给下一个过滤器的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 2019-09-06
    相关资源
    最近更新 更多