在处理rdbms数据沿袭项目时,我面临无法解决的Neo4J Cypher挑战:
这是示例:
现在,我想查询从A *节点到D的链,不显示所有A *节点,而是仅显示那些由节点C的filter属性过滤的节点。
我想这需要分多个步骤完成:
我如何在Cypher中完成此操作?
答案 0 :(得分:1)
这里是密码reference card;但基本上,您想从属性中收集多个数组,将它们组合成一个列表,然后将其用作过滤器。将所有内容组合到一个列表中所需的主要功能是EXTRACT + REDUCE,并带有一个过滤器来保护自己免受空值(未设置属性)的影响。
这里是一个Cypher,显示了如何作为一个干净的步骤进行提取+还原,并附有注释,解释了Cypher的每一步。
// 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
答案 1 :(得分:0)
因此,您是从特定的C节点开始的,需要遍历并获取:TABLE节点作为源,但仅限那些由C上的list属性过滤的节点。
这应该有效:
number num_fives
000000000 2
545678910 1
如果您有很多输入节点,并且:TABLE(name)是唯一的,那么我们可以对其进行修改以在可能的输入节点上进行预匹配,从而让我们进行节点比较而不是属性比较:
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