【发布时间】:2018-08-27 19:14:04
【问题描述】:
在处理 rdbms 数据沿袭项目时,我遇到了我无法解决的 Neo4J Cypher 挑战:
这是一个例子:
- 图表由表示数据库表(标签:TABLE)或视图(标签:VIEW)的节点组成
- 表格或其他视图通过方向 -[:SOURCES]-> 关系获取视图
- 图表的一个子集有 10 个 TABLE 节点,可以选择过滤(从图表中排除)。它们通过 name 属性命名为 A1 到 A10。这些节点具有附加标签FILTERNODE
- 这 10 个节点通过 SOURCES 关系链接到 VIEW 节点 B,示例:A1-[:SOURCES]->B
- 节点 B 依次获取 VIEW 节点 C:B-[:SOURCES]->C
- 节点 C 有一个用于过滤的数组属性:C.filter=['A2','A3']
- 节点 C 依次源 VIEW 节点 D:B-[:SOURCES]->C
现在我想查询从 A* 节点到 D 的链,不显示所有 A* 节点,而只显示节点 C 上的 filter 属性过滤的那些。
我想这需要分多个步骤完成:
- 首先选择整个子图,包含 A1..A10,B,C,D
- 然后从这个子图中唯一地收集所有过滤属性
- 在具有 FILTERNODE 属性的节点上使用收集的过滤属性,仅保留 A2、A3、B、C 和 D
如何在 Cypher 中实现这一点?
【问题讨论】:
-
您对此查询的输入是什么?您是从标识节点 C(或 D?)的东西开始,还是您的意思是查询一个没有传出 :SOURCES 关系的节点,找到它的过滤器,并将路径匹配回这些源?还是另一种方法?
-
我将图形“返回”到输入源,意思是:从节点 C 开始,到节点 B(指向 c 的源),到节点 A1..10,每个源都指向 B。但是而不是显示 A1 到 A10 节点我只想显示 A2 和 A3(因为节点 C 上的过滤器属性)
-
好的,听起来不错。你在这里使用什么标签?源节点(您的 A 节点)是否有一组通用标签?
-
是的,A 节点都有 :TABLE 标签。 C.filter 属性中的值将是这些节点的唯一键(它们的 name 属性)
-
所以,我仍然对你想要什么感到有些困惑。听起来您想要
MATCH (c{id:"start"}), (a) WHERE a.name in c.filters之类的东西,也许AND (a)-[:SOURCES*]->(c)来仔细检查它们实际上是连接的(当然在a.name 上有一个索引)。也许还有一个额外的OPTIONAL MATCH (a)-[:SOURCES*]->(b)-[:SOURCES*]->(c)来接听中间的内容。对于奖金挑战,是说 C 也可以过滤上游吗?我读到这篇文章的另一种方式是你想收集图中的所有过滤器,然后返回过滤器中的所有节点,以及它们之间的节点。