Neo4j cypher-筛选出子节点

Neo4j cypher-筛选出子节点,neo4j,cypher,Neo4j,Cypher,想象下图: 目标是查询两个实体之间的所有连接节点(本例中为“Main”和“Other”),但过滤掉相互的后代。换句话说,我希望结果集只包含a和b,但不包含c,因为c是b的后代,b已包含在结果集中。我使用此示例数据集再现了您的场景: 此查询应适用于以下情况: // match common child nodes between 'main' and 'other' MATCH (:Node {name : "Main"})-[:child]->(child:Node)<-[:ch

想象下图:


目标是查询两个实体之间的所有连接节点(本例中为“Main”和“Other”),但过滤掉相互的后代。换句话说,我希望结果集只包含ab,但不包含c,因为c是b的后代,b已包含在结果集中。

我使用此示例数据集再现了您的场景:

此查询应适用于以下情况:

// match common child nodes between 'main' and 'other'
MATCH (:Node {name : "Main"})-[:child]->(child:Node)<-[:child]-(:Node {name : "Other"})
// match the children of child when exists
OPTIONAL MATCH (child)-[:child]->(n:Node)
// store children and childrenOfChild in separeted arrays
WITH collect(child) as children, collect(n) as childrenOfChild
// filter ...
WITH filter(child in children WHERE NOT child IN childrenOfChild) as directChildren
UNWIND directChildren as directChild
// return only direct child
RETURN directChild

如果我正确理解了问题的情况,那么您需要找到这样的子节点,从原始节点到这些子节点只有一种方式:

MATCH p = (Main:Node {id: 'main'})
          -[:child*]->(T:Node)<-[:child*]-
          (Other:Node {id: 'other'})
WITH T, 
     collect(p) as pw WHERE size(pw) = 1
RETURN T
MATCH p=(Main:Node{id:'Main'})

-[:child*]->(T:Node)此查询收集两个实体的所有直系子体,然后筛选出具有直系子体作为父实体的实体:

MATCH (:Node {name : "Main"})-[:child]->(child:Node)<-[:child]-(:Node {name : "Other"})
WITH COLLECT(child) AS children
UNWIND children AS c
MATCH (c)<-[:child]-(parent:Node)
WITH c, children, COLLECT(parent) AS parents
WHERE NONE(p IN parents WHERE p IN children)
RETURN c;

MATCH(:Node{name:“Main”})-[:child]->(child:Node)我也不明白。“互连节点”的确切规格是什么?事后看来,它的表述很糟糕。现在好点了吗?您声明要“过滤掉相互的后代”,只保留
a
b
。但是
a
b
c
都是“共同的后代”(属于
Main
Other
)。你到底想找什么?@cybersam a和b,但不是c;)创造性地看待问题!但是,使用2个无限可变长度模式通常会导致查询永远运行或内存不足。
MATCH (:Node {name : "Main"})-[:child]->(child:Node)<-[:child]-(:Node {name : "Other"})
WITH COLLECT(child) AS children
UNWIND children AS c
MATCH (c)<-[:child]-(parent:Node)
WITH c, children, COLLECT(parent) AS parents
WHERE NONE(p IN parents WHERE p IN children)
RETURN c;