如何在neo4j中不使用标签部分隔离子图
我正在创建一个包含大量大致树状结构的子图的图,因为每个子图的“根”只有向外指向的关系。此子图的许多叶子和分支都包含与根相关的数据。这样,像下面这样的单个查询将返回与给定根关联的所有数据,并且只返回与该根关联的数据:如何在neo4j中不使用标签部分隔离子图,neo4j,cypher,Neo4j,Cypher,我正在创建一个包含大量大致树状结构的子图的图,因为每个子图的“根”只有向外指向的关系。此子图的许多叶子和分支都包含与根相关的数据。这样,像下面这样的单个查询将返回与给定根关联的所有数据,并且只返回与该根关联的数据: MATCH (root:ROOT {id: 'foo'})-[*]->(leaves) RETURN leaves 有非常充分的理由对此查询进行优化。然而,子图并不是真正孤立的,因为一些叶子实际上是可以从许多根接收关系的类别,所以存在这样的结构: (root)-[]->
MATCH (root:ROOT {id: 'foo'})-[*]->(leaves) RETURN leaves
有非常充分的理由对此查询进行优化。然而,子图并不是真正孤立的,因为一些叶子实际上是可以从许多根接收关系的类别,所以存在这样的结构:
(root)-[]->(category)<-[]-(root)
以及如下所示的主查询:
(root)-[:bar]->(foreign_root)-[]->(foreign_leaves)
MATCH (root {id: 'foo'})-[*]->(leaves) WHERE NOT (root)-[:bar]->(leaves) RETURN leaves
生成一个(foreign\u leaves)
的结果由于多种原因,这是不可取的,因为它会使最重要的查询变大,并且实际上不会隔离图形
所以,从某种意义上说,我在问,有没有一种方法可以在这两个根之间创建一个直接的,1对1的关系,而不会造成大量的图污染或子图之间的交叉污染?从更大的意义上说,我是否错误地看待这个问题?我想你差不多做到了。在上一个Cypher查询中,可以调整WHERE子句,使其不会实例化
:bar
关系的目标节点。像这样:
MATCH (root {id: 'foo'})-[*]->(leaves)
WHERE NOT (root)-[:bar]->()
RETURN leaves
这样,您可以过滤掉所有以
:bar
关系开头的路径。我会在树内、树之间或从一个类别到另一个类别使用显式的rel类型。然后使用显式rel类型编写查询。