首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不使用neo4j标签的情况下部分隔离子图

如何在不使用neo4j标签的情况下部分隔离子图
EN

Stack Overflow用户
提问于 2015-01-09 23:20:32
回答 1查看 294关注 0票数 1

我正在创建一个包含大量大致类似树状结构的子图的图,因为每个子图的“根”只有外部有向关系。这个子图的许多叶子和分支都包含与根相关的数据。这样,像下面这样的单个查询将返回与给定根关联的所有数据,并且只返回与该根关联的数据:

代码语言:javascript
复制
MATCH (root:ROOT {id: 'foo'})-[*]->(leaves) RETURN leaves

有很强的理由对此查询进行优化。然而,子图并不是真正孤立的,因为有些叶子实际上是可以接收来自多个根的关系的类别,因此这样的结构存在:

代码语言:javascript
复制
(root)-[]->(category)<-[]-(root)

这似乎是维护子图完整性的一个很好的方法,同时也允许它们之间的复杂关系,但是有一个问题。我不能在根之间有简单的一对一的关系,否则一个根会污染另一个对第一个查询的响应。在我看来,只有两个真正的选择。

  1. 为根之间的每个1到1的关系构建一个新的虚拟节点。就像这样: (根)-[]->(虚拟)<-[]-(根) 我讨厌这种选择。它会扩散无用的节点,稀释关系的概念。
  2. 给每个子图的每个子图一个标签,标识它是子图的一个成员。在我看来,这是一个更糟糕的选择。因为子图有几千个,它会极大地污染标签的空间。

我还考虑过在直接关系的标签上过滤,但这只排除了外来根,而不是它的子根。见下文:

在具有如下结构的直接1到1关系的标签上筛选:

代码语言:javascript
复制
(root)-[:bar]->(foreign_root)-[]->(foreign_leaves)

以及这样的主要查询:

代码语言:javascript
复制
MATCH (root {id: 'foo'})-[*]->(leaves) WHERE NOT (root)-[:bar]->(leaves) RETURN leaves

产生(foreign_leaves)的结果--由于多种原因,这是不可取的,因为它使最重要的查询更大,而且实际上并没有隔离图形。

所以,在某种意义上,我要问的是,有没有办法在这两个根之间建立一种直接的,1比1的关系,而不造成大量的图形污染或子图之间的交叉污染?从更大的意义上说,我是否错误地看待了这个问题?

EN

回答 1

Stack Overflow用户

发布于 2015-01-10 01:45:57

我想你快到了。在上一个Cypher查询中,您可以调整WHERE子句,这样它就不会实例化:bar关系的目标节点。如下所示:

代码语言:javascript
复制
MATCH (root {id: 'foo'})-[*]->(leaves)
WHERE NOT (root)-[:bar]->()
RETURN leaves

这样,就可以筛选出从:bar关系开始的所有路径。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27870872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档