设置
我对图形数据库和 neo4j/cypher 非常陌生,我很难理解如何从结果中排除各种部分。下面是我的图表的图像。每个节点和每个关系都有一个 activeFrom
和 activeTo
属性,使我能够查看历史上任何给定点存在的图表。
MATCH (:Collective:Company)<-[tree *0..4]-(downline:Collective) RETURN downline
(任何与日期的关系都表明它已经过期或计划( future 日期)过期。没有日期或 future 日期意味着它处于事件状态。)。
问题
我的最终目标是查看同一个图表,减去所有过期的节点和关系。现在,我正在尝试构建让我看到这一点的查询,但失败了:(
我不明白的是为什么:
Region5
与Company1
的关系仍然有效...为什么公司没有出现? (0长度路径不应该像第一张图片中那样让公司回来吗?)Office5
和Office27
的关系都已过期,那么为什么它们仍然出现在结果中?- 办事处 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 沙箱,供大家在需要时使用。 请对此保持成熟,因为我不知道如何使其只读。请不要删除数据并给其他人带来麻烦。我也亲自为这个云实例付费,所以请不要滥用虚拟机/资源:)
您可以在此处访问它:(抱歉,出于安全目的,现已删除该问题)。
最佳答案
根据您的问题,我正在尝试拼凑您所需要的内容,并且我了解您希望返回包含所有事件节点和关系的路径。这是因为您询问了 Office 27 和 Office 5,它们都是事件节点,但它们与区域 5 的单一关系处于非事件状态,因此您不希望 Office 27->区域 5 和 Office 5->区域 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,请将“全部”更改为“任意”,您将在结果中看到这些内容,因为该路径现在部分处于事件状态。
顺便说一句,您还可以将图表设置为 http://console.neo4j.org/?init=0并分享
关于database - 从图中排除节点时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32322048/