无法从图中排除节点

Trouble Excluding Nodes from Graph

设置

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

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

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


问题

我的最终目标是查看同一张图,减去所有过期的节点和关系。现在,我正在尝试构建可以让我看到的查询,但失败了:(

我不明白的是为什么:

  1. Region5Company1 的关系仍然活跃...为什么公司没有出现? (0 长度的路径不应该像第一张图片那样把公司带回来吗?)
  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 沙箱供你们在需要时使用。 请成熟一点,因为我不知道如何将其设置为只读。请不要为其他人删除数据和搞砸事情。我也亲自为这个云实例付费,所以请不要滥用 VM/resources :)

您可以在此处访问它:(抱歉,出于安全原因删除了该问题,现在该问题已得到解答)。

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

然而,办公室 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 设置您的图表并分享它