neo4j cypher查询查找不包括特定路径的所有子级

neo4j cypher查询查找不包括特定路径的所有子级,neo4j,cypher,Neo4j,Cypher,对于类似于此示例的图形 如果我们知道某个特定帐户下某个子节点上的起点,那么我们如何遍历所有相关节点,而不考虑向上遍历到客户节点的方向,而不向下遍历到另一个帐户,因此基本上总是停在客户处(在Neo4j中使用Cypher) 我目前有一个这样的查询,但我不知道如何在到达客户节点后停止查询,但仍然在遍历下面任何节点的链接 MATCH(p:Customer{key:'Customer:1011'})-[*8](connected)返回distinct(connected.key) 基本上,我希望有一个通

对于类似于此示例的图形

如果我们知道某个特定帐户下某个子节点上的起点,那么我们如何遍历所有相关节点,而不考虑向上遍历到客户节点的方向,而不向下遍历到另一个帐户,因此基本上总是停在客户处(在Neo4j中使用Cypher)

我目前有一个这样的查询,但我不知道如何在到达客户节点后停止查询,但仍然在遍历下面任何节点的链接

MATCH(p:Customer{key:'Customer:1011'})-[*8](connected)返回distinct(connected.key)


基本上,我希望有一个通用查询,它可以接受唯一标识Customer节点下起始节点的任何标签/键,并遍历所有子项(不包括指向其他帐户的路径)

欢迎使用StackOverflow!是的,您可以通过指定路径中最后一个节点必须具有的标签来实现这一点-让我们浏览一下它

首先,让我们创建一个示例图——我发明了一些似是而非的关系名称:

MERGE (cus1: Customer { id: 1 })
MERGE (acc1: Account { id: 1 })
MERGE (acc2: Account { id: 2 })
MERGE (con1: Contract { id: 1 })
MERGE (con2: Contract { id: 2 })
MERGE (bui1: Building { id: 1 })
MERGE (bui2: Building { id: 2 })
MERGE (sp1: ServicePoint { id: 1 })
MERGE (sp2: ServicePoint { id: 2 })
MERGE (b1: Bill { id: 1 })
MERGE (b2: Bill { id: 2 })
MERGE (b3: Bill { id: 3 })
MERGE (b4: Bill { id: 4 })
MERGE (cus1)-[:HOLDS]->(acc1)
MERGE (cus1)-[:HOLDS]->(acc2)
MERGE (acc1)-[:CONTAINS]->(con1)
MERGE (acc2)-[:CONTAINS]->(con2)
MERGE (bui1)-[:COVERED_BY]->(con1)
MERGE (bui2)-[:COVERED_BY]->(con2)
MERGE (sp1)-[:BELONGS_TO]->(con1)
MERGE (sp2)-[:BELONGS_TO]->(con2)
MERGE (b1)-[:RELATES_TO]->(sp1)
MERGE (b2)-[:RELATES_TO]->(sp1)
MERGE (b3)-[:RELATES_TO]->(sp2)
MERGE (b4)-[:RELATES_TO]->(sp2)

现在让我们从一项法案开始——法案2:

MATCH path=(b: Bill { id: 2 })-[*]-(c: Customer)
RETURN path

我们要求提供从清单2开始到任何客户节点结束的任何长度的所有路径。Neo不会返回包含帐户1的分行,因为它不是账单2和客户1之间任何路径的一部分。然而,出于同样的原因,我们也没有退还账单1,即使它与我们最终的账户相连

如果您想要匹配帐户的整个子图,您可以分两步完成-以您的方式返回到客户和帐户,然后返回到连接到帐户的所有节点:

MATCH (b: Bill { id: 2 })-[*]-(a: Account)-[]-(c: Customer)
MATCH path=(c)-[]->(a)-[*]-()
RETURN path

欢迎使用StackOverflow!是的,您可以通过指定路径中最后一个节点必须具有的标签来实现这一点-让我们浏览一下它

首先,让我们创建一个示例图——我发明了一些似是而非的关系名称:

MERGE (cus1: Customer { id: 1 })
MERGE (acc1: Account { id: 1 })
MERGE (acc2: Account { id: 2 })
MERGE (con1: Contract { id: 1 })
MERGE (con2: Contract { id: 2 })
MERGE (bui1: Building { id: 1 })
MERGE (bui2: Building { id: 2 })
MERGE (sp1: ServicePoint { id: 1 })
MERGE (sp2: ServicePoint { id: 2 })
MERGE (b1: Bill { id: 1 })
MERGE (b2: Bill { id: 2 })
MERGE (b3: Bill { id: 3 })
MERGE (b4: Bill { id: 4 })
MERGE (cus1)-[:HOLDS]->(acc1)
MERGE (cus1)-[:HOLDS]->(acc2)
MERGE (acc1)-[:CONTAINS]->(con1)
MERGE (acc2)-[:CONTAINS]->(con2)
MERGE (bui1)-[:COVERED_BY]->(con1)
MERGE (bui2)-[:COVERED_BY]->(con2)
MERGE (sp1)-[:BELONGS_TO]->(con1)
MERGE (sp2)-[:BELONGS_TO]->(con2)
MERGE (b1)-[:RELATES_TO]->(sp1)
MERGE (b2)-[:RELATES_TO]->(sp1)
MERGE (b3)-[:RELATES_TO]->(sp2)
MERGE (b4)-[:RELATES_TO]->(sp2)

现在让我们从一项法案开始——法案2:

MATCH path=(b: Bill { id: 2 })-[*]-(c: Customer)
RETURN path

我们要求提供从清单2开始到任何客户节点结束的任何长度的所有路径。Neo不会返回包含帐户1的分行,因为它不是账单2和客户1之间任何路径的一部分。然而,出于同样的原因,我们也没有退还账单1,即使它与我们最终的账户相连

如果您想要匹配帐户的整个子图,您可以分两步完成-以您的方式返回到客户和帐户,然后返回到连接到帐户的所有节点:

MATCH (b: Bill { id: 2 })-[*]-(a: Account)-[]-(c: Customer)
MATCH path=(c)-[]->(a)-[*]-()
RETURN path