【问题标题】:Neo4j - Intersect two node lists using CypherNeo4j - 使用 Cypher 将两个节点列表相交
【发布时间】: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 获取其中的所有节点

标签: neo4j cypher


【解决方案1】:

这应该可以工作(假设您将id1id2 作为参数传递):

MATCH (a)--(n)--(c)
WHERE ID(a) = {id1} AND ID(c) = {id2}
RETURN n;

[更新,基于来自 cmets 的新信息]

如果您有多个“相同”节点的“克隆”,并且您想快速确定哪些克隆相关而无需执行大量(缓慢)属性比较,则可以添加关系(例如,键入“:克隆”)在克隆之间。这样,这样的查询就可以工作了:

MATCH (a)--(m)-[:CLONE]-(n)--(c)
WHERE ID(a) = {id1} AND ID(c) = {id2}
RETURN m, n;

【讨论】:

  • 我在我的示例中尝试了该模式,但它不起作用,可能是因为我对问题的某个特定方面不够清楚。我在两个图上表示为相同的节点 (b) 实际上是 db 上的两个不同节点,每个节点都与不同的图(g1 和 g2)相关。代表性的是,它们是相同的,因为它们具有完全相同的信息(标签和属性),但在数据库中却不是。我很抱歉,因为在这件事上没有更明确是我的错:(
  • 我已经用一种可能合适的方法更新了我的答案。
【解决方案2】:

您可以使用以下查询找到节点的重复性 - [1] 单节点重复 -

MATCH pathx =(n)-[:Relationship]-(find) WHERE  find.name = "action" RETURN pathx; 

[2] 或者对于只给出直接父节点的两个节点

MATCH pathx =(n)-[:Relationship]-(find), pathy= (p)-[:Relationship]
-(seek) WHERE  find.name = "action" AND seek.name="requestID" RETURN pathx, 
pathy;

[3] 或者找到整个网络,即所有连接的节点 -

MATCH pathx =(n)--()-[:Relationship]-(find), pathy= (p)--()-[:Relationship]- 
(seek) WHERE  find.name = "action" 
AND seek.name="requestID" RETURN pathx, pathy;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    相关资源
    最近更新 更多