基于上游节点过滤属性过滤Neo4J中的传入节点
在从事rdbms数据沿袭项目时,我面临一个我无法解决的Neo4J密码挑战: 这是一个示例:基于上游节点过滤属性过滤Neo4J中的传入节点,neo4j,cypher,Neo4j,Cypher,在从事rdbms数据沿袭项目时,我面临一个我无法解决的Neo4J密码挑战: 这是一个示例: 图形由表示数据库表(标签:表)或视图(标签:视图)的节点组成 表或其他视图通过定向关系从源到视图 图的一个子集有10个表节点,可以选择对其进行筛选(从图中排除)。它们通过name属性命名为A1到A10。这些节点具有附加标签FILTERNODE 这10个节点通过源关系链接到查看节点B,例如:A1-[:源]->B 节点B依次查看节点C:B-[:sources]->C 节点C有一个用于筛选的数组属性:C.fil
如何在Cypher中实现这一点?因此,您从一个特定的节点C开始,需要往回遍历并获取:表节点,这些节点充当源,但仅限于那些通过C上的list属性过滤的节点 这应该起作用:
MATCH (c)
WHERE id(c) = 123 // standin for however you match to your starting node
WITH c, c.filter as allowed
MATCH (a:TABLE)-[:SOURCES*]->(c)
WHERE a.name in allowed
RETURN a
如果您有很多输入节点,并且:TABLE(name)是唯一的,那么我们可以修改它以预匹配可能的输入节点,让我们进行节点比较,而不是属性比较:
MATCH (c)
WHERE id(c) = 123 // standin for however you match to your starting node
MATCH (a:TABLE)
WHERE a.name in c.filter
WITH c, collect(a) as allowed
MATCH (a:TABLE)-[:SOURCES*]->(c)
WHERE a in allowed
RETURN a
这是密码;但基本上,您希望从属性中收集多个数组,将它们合并为一个列表,然后将其用作过滤器。您需要将所有内容合并到一个列表中的主要内容是EXTRACT+REDUCE,它带有一个过滤器来保护自己不受空值的影响(未设置属性)
下面是一个密码,展示了如何将提取+减少作为一个干净的步骤,并用注释解释密码的每个步骤
// Match our starting point, and collect all child views (0.. collects itself too)
MATCH (:TABLE)-[:SOURCES]->(start:View)-[:SOURCES*0..25]->(view:View)
// Make sure we only have one copy of each view
WITH COLLECT(DISTINCT view) as views
// Collect all filters (if they exist) into one list
WITH views, reduce(s = [], v IN [x IN views WHERE EXISTS(x.filter) | x.filter]| s + v.filter) as filters
// Match all tables in filter list
MATCH (a:TABLE)
WHERE a.name IN filters
// Format return; Everything in one column
WITH views+COLLECT(a) as ns
UNWIND ns as n
RETURN n
您对此查询的输入是什么?您是从标识节点C(或D?)的内容开始,还是要查询没有传出源关系的节点,查找其筛选器,并将路径匹配回这些源?或者这是一种不同的方法?我遍历de-graph“返回”到输入源,意思是:从节点C开始,到节点B(源朝向C),到节点A1..10,每个源朝向B。但不是显示A1到A10节点,我只想显示A2和A3(因为节点C上的filter属性),好的,听起来不错。你在这里用什么标签?源节点(您的a节点)是否有一组通用标签?是的,a节点都有:TABLE标签。C.filter属性中的值将是这些节点的唯一键(它们的name属性),因此,我仍然有点困惑您想要什么。这听起来像是想让
匹配(c{id:“start”}),(a)其中c.filters中的a.name
,可能是和(a)-[:SOURCES*]->(c)
来双重检查它们是否实际连接(当然是在a.name上有一个索引)。可能还有一个额外的可选匹配(a)-[:SOURCES*]->(b)-[:SOURCES*]->(c)
来选择中间的匹配。对于奖金挑战,是不是说C也可以向上游过滤?我读这篇文章的另一种方式是,您希望收集图表中的所有过滤器,然后返回过滤器中的所有节点,以及它们之间的节点。您好,这不是我想要的,请参阅我更改的问题/尝试将其弄清楚。仅供参考,过滤属性可能在子图中的任何位置,我不知道它在C中。哈,这看起来像是我可以使用的东西,我的密码没有那么先进(尚未),但我明白你在这里做什么!