Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于上游节点过滤属性过滤Neo4J中的传入节点_Neo4j_Cypher - Fatal编程技术网

基于上游节点过滤属性过滤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

在从事rdbms数据沿袭项目时,我面临一个我无法解决的Neo4J密码挑战:

这是一个示例:

  • 图形由表示数据库表(标签:)或视图(标签:视图)的节点组成
  • 表或其他视图通过定向关系从源到视图
  • 图的一个子集有10个表节点,可以选择对其进行筛选(从图中排除)。它们通过name属性命名为A1到A10。这些节点具有附加标签FILTERNODE
  • 这10个节点通过源关系链接到查看节点B,例如:A1-[:源]->B
  • 节点B依次查看节点C:B-[:sources]->C
  • 节点C有一个用于筛选的数组属性:C.filter=['A2','A3']
  • 节点C依次查看节点D:B-[:源]->C
  • 现在我想查询从A*节点到D的链,不显示所有A*节点,只显示节点C上按filter属性过滤的节点

    我想这需要分多个步骤来完成:

  • 首先选择包含A1..A10、B、C、D的整个子图
  • 然后从该子图中唯一地收集所有筛选属性
  • 在具有FILTERNODE属性的节点上使用收集的筛选属性仅保留A2、A3、B、C和D

  • 如何在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中。哈,这看起来像是我可以使用的东西,我的密码没有那么先进(尚未),但我明白你在这里做什么!