我正在创建一个包含大量大致类似树状结构的子图的图,因为每个子图的“根”只有外部有向关系。这个子图的许多叶子和分支都包含与根相关的数据。这样,像下面这样的单个查询将返回与给定根关联的所有数据,并且只返回与该根关联的数据:
MATCH (root:ROOT {id: 'foo'})-[*]->(leaves) RETURN leaves有很强的理由对此查询进行优化。然而,子图并不是真正孤立的,因为有些叶子实际上是可以接收来自多个根的关系的类别,因此这样的结构存在:
(root)-[]->(category)<-[]-(root)这似乎是维护子图完整性的一个很好的方法,同时也允许它们之间的复杂关系,但是有一个问题。我不能在根之间有简单的一对一的关系,否则一个根会污染另一个对第一个查询的响应。在我看来,只有两个真正的选择。
我还考虑过在直接关系的标签上过滤,但这只排除了外来根,而不是它的子根。见下文:
在具有如下结构的直接1到1关系的标签上筛选:
(root)-[:bar]->(foreign_root)-[]->(foreign_leaves)以及这样的主要查询:
MATCH (root {id: 'foo'})-[*]->(leaves) WHERE NOT (root)-[:bar]->(leaves) RETURN leaves产生(foreign_leaves)的结果--由于多种原因,这是不可取的,因为它使最重要的查询更大,而且实际上并没有隔离图形。
所以,在某种意义上,我要问的是,有没有办法在这两个根之间建立一种直接的,1比1的关系,而不造成大量的图形污染或子图之间的交叉污染?从更大的意义上说,我是否错误地看待了这个问题?
发布于 2015-01-10 01:45:57
我想你快到了。在上一个Cypher查询中,您可以调整WHERE子句,这样它就不会实例化:bar关系的目标节点。如下所示:
MATCH (root {id: 'foo'})-[*]->(leaves)
WHERE NOT (root)-[:bar]->()
RETURN leaves这样,就可以筛选出从:bar关系开始的所有路径。
https://stackoverflow.com/questions/27870872
复制相似问题