【发布时间】:2017-05-28 06:17:55
【问题描述】:
有以下图表:
具有子节点 (a, b) 的节点 g1
具有子节点 (b, c) 的节点 g2
使用查询
MATCH (n)-[]-(m) WHERE ID(m) = id RETURN n
作为id节点g1的id,我得到a和b,反之亦然,当使用g2的id时。我想了解的是如何获得这两个结果的交集,在这种情况下具有 first return (a, b) 和 second return (b, c) 获得最终结果 (b)。
我尝试使用 WITH 原因,但无法达到预期的结果。请记住,我是 Neo4j 的新手,只是在几次失败的尝试、对 Neo4j 文档的研究、一般的谷歌搜索和 堆栈溢出。
Edit1(我的尝试之一):
MATCH (n)-[]->(m)
WHERE ID(m) = 750
WITH n
MATCH (o)-[]->(b)
WHERE ID(b) = 684 and o = n
RETURN o
编辑2:
我在两个图上表示为相同的节点 (b) 实际上是 db 上的两个不同节点,每个节点都与不同的图(g1 和 g2)相关。代表性的是,它们是相同的,因为它们具有完全相同的信息(标签和属性),但在数据库中却不是。我很抱歉,因为在这件事上没有更明确是我的错:(
编辑3:
为什么我不对两个图使用单个节点 (b)
以上面的图表为例,假设我还有另一层:在 g1 上,子节点 (b) 作为子节点 (e),而在 g2 上,子节点 (b) 作为子节点 (f)。如果我将 (b) 作为单个节点,当我创建 (e) 和 (f) 时,我只能将它添加到 (b) 失去层次结构,变得无法区分它们中的哪一个,(e) 或 (f),属于 g1 或 g2。
【问题讨论】:
-
是否有两个单独的“b”节点具有完全相同的标签和属性,而不是仅使用单个节点来表示它?如果节点代表逻辑上相同的实体,通常在图形数据库中使用单个节点而不是多个节点是有意义的,因为这使您可以查询它如何连接到不同上下文中的不同数据,例如这个它可能是两个图表的一部分。
-
我的问题很简单。以上面的图表为例,假设我还有另一层:在 g1 上,子节点 (b) 作为子节点 (e),而在 g2 上,子节点 (b) 作为子节点 (f)。如果我有(b)作为单个节点,当我创建(e)和(f)时,我只能将它添加到(b)失去层次结构,变得无法区分它们中的哪一个,(e)或(f),属于 g1 或 g2。
-
很公平,如果层次结构很重要,并且如果期望子节点在不同的子图上有所不同,那么这是有道理的。 (然而,另一种方法是使用关系属性,一个图的关系与另一个子图的关系具有不同的属性)但是,您仍然需要一种方法来识别逻辑上相同的节点,即使它们不是同一个节点。如果所有属性都必须匹配,那么检查“相同”节点的任何查询都必须检查所有节点与所有其他节点,这效率不高。
-
你的意思是喜欢 (b)
-
类似的东西,虽然正确的表示(假设目前关系的类型是 :Connects,因为你没有提供类型)是
(b)<-[:Connects {belongsTo: 'g1'}]-(e)。如果您想要整个“g1”子图,如果您已经在该子图中的节点 n 上匹配,则可以使用MATCH (n)-[rels:Connects*0..]-(subgraphNode) WHERE ALL (rel in rels WHERE rel.belongsTo = 'g1') RETURN DISTINCT subgraphNode获取其中的所有节点