Neo4j - 使用Cypher交叉两个节点列表

时间:2017-01-12 23:44:35

标签: neo4j cypher

有以下图表:

  • 带有子节点的节点g1(a,b)

  • 具有子节点的节点g2(b,c)

使用查询

MATCH (n)-[]-(m) WHERE ID(m) = id RETURN n

id 节点g1的id,我得到a和b,反之亦然,当使用g2的id时。我想了解的是如何得到这两个结果的交集,在这种情况下,第一次返回(a,b)第二次返回(b,c)< / strong>获得最终结果(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

EDIT2:

我在两个图上表示为相同的节点(b)实际上是db上的两个不同节点,每个节点与不同的图(g1和g2)相关。代表性地,它们是相同的,因为它们具有完全相同的信息(标签和属性),但在数据库中,您不是。我很抱歉,因为在这件事上没有更明确是我的错:(

编辑3:

为什么我不为单个节点使用单个节点(b)

使用上面的图表作为示例,假设我还有另一层,所以:在g1上,子节点(b)作为子节点(e),而在g2上,子节点(b)作为子节点(f)。如果我将(b)作为单个节点,当我创建(e)和(f)时,我只能将它添加到(b)失去层次结构,变得无法区分它们中的哪一个,(e)或(f),属于g1 ou g2。

2 个答案:

答案 0 :(得分:2)

这应该有效(假设您将id1id2作为参数传递):

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

[更新,基于评论的新信息]

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

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

答案 1 :(得分:0)

通过使用此查询,您可以找到节点的重复性- [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;