Graph 从一个节点继承属性,该节点与neo4j中的另一个节点及其子节点具有关系

Graph 从一个节点继承属性,该节点与neo4j中的另一个节点及其子节点具有关系,graph,neo4j,cypher,Graph,Neo4j,Cypher,从所有父级继承属性 假设我有一个以下格式的图表。我希望一个节点的属性(如果它有关系的话,它将在account节点中)由它的子节点继承。假设父节点和子节点关系由[r:child]维护,帐户信息由[r2:account]维护。如果节点有多个父节点,则需要使用第一个帐户从其所有父节点继承: (a0:ACCOUNT)<-[:HAS_ACCOUNT]-Morpheus \ (a1:ACCOUNT

从所有父级继承属性

假设我有一个以下格式的图表。我希望一个节点的属性(如果它有关系的话,它将在account节点中)由它的子节点继承。假设父节点和子节点关系由[r:child]维护,帐户信息由[r2:account]维护。如果节点有多个父节点,则需要使用第一个帐户从其所有父节点继承:

       (a0:ACCOUNT)<-[:HAS_ACCOUNT]-Morpheus
                                     \
         (a1:ACCOUNT)<-[:HAS_ACCOUNT]-Neo
                                       \
                                       alpha    
                                        \ 
                                       gamma    beta - [:HAS_ACCOUNT]->(a2:ACCOUNT)
                                          \    /
                                            A 
                                          /   \
            (a3:ACCOUNT)<-[:HAS_ACCOUNT]-B     C
                                       /  \   /  \
                                      D    E  F   G
这是我的密码,我想出了,让我所有的帐户,所有的父母。它有时不起作用

MATCH (node:Person{personID:"A"})
MATCH (account:ACCOUNT)
MATCH p =(parent:Person)-[:CHILD*1..]->(node)
where (parent)-[:HAS_ACCOUNT]->(account)
UNWIND RELATIONSHIPS(p) AS rel 
WITH p, account, COUNT(DISTINCT rel) AS nRoutes 
RETURN account,p, nRoutes 
ORDER BY nRoutes
这是一个棘手的问题

存在一个纯密码解决方案,但这是一个复杂的查询,需要一些潜在的大量过滤来清除到帐户持有节点的路径,这些路径超出了同一路径上较近的帐户持有节点

但是,我发现了一个更好的替代方法,使用Cypher和,再加上一些预处理,将标签添加到帐户持有者的节点

APOC的路径扩展器有一种扩展的方法,同时考虑标签过滤器,还有一种定义标签的方法,该标签应删减任何进一步的遍历,但应作为解决方案包括在内。在获取节点的帐户持有祖先时,我们将使用此限制扩展

下面是一个创建查询,用于在示例中重新创建图形(尽管我将非帐户节点标记为:Node):

接下来,我们标记帐户持有节点

MATCH (acc:ACCOUNT)
WITH acc
MATCH (acc)<-[:HAS_ACCOUNT]-(holder)
SET holder:ACCOUNT_HOLDER
匹配(acc:帐户)
与acc
匹配(acc)这是一个棘手的问题

存在一个纯密码解决方案,但这是一个复杂的查询,需要一些潜在的大量过滤来清除到帐户持有节点的路径,这些路径超出了同一路径上较近的帐户持有节点

但是,我发现了一个更好的替代方法,使用Cypher和,再加上一些预处理,将标签添加到帐户持有者的节点

APOC的路径扩展器有一种扩展的方法,同时考虑标签过滤器,还有一种定义标签的方法,该标签应删减任何进一步的遍历,但应作为解决方案包括在内。在获取节点的帐户持有祖先时,我们将使用此限制扩展

下面是一个创建查询,用于在示例中重新创建图形(尽管我将非帐户节点标记为:Node):

接下来,我们标记帐户持有节点

MATCH (acc:ACCOUNT)
WITH acc
MATCH (acc)<-[:HAS_ACCOUNT]-(holder)
SET holder:ACCOUNT_HOLDER
匹配(acc:帐户)
与acc

匹配(acc)我对继承应该如何工作有点困惑。从节点B、D和E的示例来看,您似乎想要最接近的帐户(您自己的帐户或从最接近的父帐户继承的帐户)。但对于节点A来说,beta的帐户应该是最接近的。即使beta不存在,那么它看起来应该只获取Neo的帐户作为最近的父帐户,而不包括Morpheus的帐户,后者是一个节点。你能澄清一下吗?如果是B,D和E…,B有账户。因此,这将传递给D和E。假设,如果B没有帐户,它需要从A获得(因为A是B的唯一父项)。。对于节点A,它有两个父节点。而且它没有账户,所以它从它的父母那里得到了账户。如果节点A有一个帐户,则该帐户将传递给其子节点。如果节点A没有帐号,如果beta不存在,它应该从Neo(而不是Morpheus)获得帐号。如果beta存在,它必须从Neo获得beta和beta(因为节点A现在有两个父节点-gamma和beta)。感谢澄清。在阅读表格时,我将a2与a0混淆,在二读时,预期的输出看起来很好,但您可能希望确保a2位于:ACCOUNT节点上,而不是关系上。单个节点可以只有一个附加帐户,还是可以有多个附加帐户?此外,如果C有另一个父节点delta,则该父节点具有帐户a4,它的继承账户应该是什么?a1、a2和a4?我对继承应该如何工作有点困惑。从节点B、D和E的示例来看,您似乎想要最接近的帐户(您自己的帐户或从最接近的父帐户继承的帐户)。但对于节点A来说,beta的帐户应该是最接近的。即使beta不存在,那么它看起来应该只获取Neo的帐户作为最近的父帐户,而不包括Morpheus的帐户,后者是一个节点。你能澄清一下吗?如果是B,D和E…,B有账户。因此,这将传递给D和E。假设,如果B没有帐户,它需要从A获得(因为A是B的唯一父项)。。对于节点A,它有两个父节点。而且它没有账户,所以它从它的父母那里得到了账户。如果节点A有一个帐户,则该帐户将传递给其子节点。如果节点A没有帐号,如果beta不存在,它应该从Neo(而不是Morpheus)获得帐号。如果beta存在,它必须从Neo获得beta和beta(因为节点A现在有两个父节点-gamma和beta)。感谢澄清。在阅读表格时,我将a2与a0混淆,在二读时,预期的输出看起来很好,但您可能希望确保a2位于:ACCOUNT节点上,而不是关系上。单个节点可以只有一个附加帐户,还是可以有多个附加帐户?此外,如果C有另一个父节点delta,则该父节点具有帐户a4,它的继承账户应该是什么?a1、a2和a4?谢谢你。我很忙,无法尝试这个。我会在几天内试一下汉克斯·弗雷法尔康。我很忙,无法尝试这个。过几天我会试试这个
MATCH (acc:ACCOUNT)
WITH acc
MATCH (acc)<-[:HAS_ACCOUNT]-(holder)
SET holder:ACCOUNT_HOLDER
// parameterize this in your own query
with 'A' as nodeName
match (node:Node{name:nodeName})-[r:CHILD*0..]->(currentNode)
with node, currentNode, size(r) as distance
optional match (currentNode)-[:HAS_ACCOUNT]->(acc)
with node, currentNode, distance, collect(acc) as accounts
// we now have all child nodes of the given node and their accounts, if they exist.

// this expands up from each currentNode, 
// stopping each expansion at the closest ACCOUNT_HOLDER node
call apoc.path.expand(currentNode, '<CHILD', '/ACCOUNT_HOLDER', -1, -1)
yield path
with node, currentNode, distance, accounts, last(nodes(path)) as holder
// get the account for each holder, 
// but only if the current doesn't have its own accounts
optional match (holder)-[:HAS_ACCOUNT]->(acc)
where size(accounts) = 0
with node, currentNode, accounts, collect(acc) as inherited, distance
order by distance asc
return node, currentNode, accounts, inherited