关系的所有排列

时间:2017-06-19 11:48:19

标签: neo4j cypher

我不明白如何返回关系的所有可用配置。这可能很容易,但我无法绕过它。

例如,给定:

e.g

CREATE (:STARTER{name: 'start'}), (:ENDER{name: 'end'})
CREATE (:Upstream{name: 'A'}), (:Upstream {name: 'B'}), (:Upstream {name: 'C'})
CREATE (:Downstream {name: '1'}),(:Downstream {name: '2'}),(:Downstream {name: '3'})

MATCH(s:STARTER), (u:Upstream)
CREATE (s)-[:owns]->(u)

MATCH(e:ENDER), (d:Downstream)
CREATE (e)-[:owns]->(d)

MATCH(a:Upstream {name: 'A'}), (d:Downstream)
CREATE (a)-[:related]->(d)

MATCH(b:Upstream {name: 'B'}), (d:Downstream)
CREATE (b)-[:related]->(d)

MATCH(c:Upstream {name: 'C'}), (d:Downstream)
CREATE (c)-[:related]->(d)

我想从上游节点返回下游节点可用的所有配置(如果它们是相关的)(为了方便起见,它们在示例中都是相关的)

在此示例中,必须始终使用DOWNSTREAM 1,2和3。回报看起来像是相关的

Downstream 1 | Downstream 2 | Downstream 3
__________________________________________
Upstream A   | Upstream A   | Upstream A
Upstream A   | Upstream A   | Upstream B
Upstream A   | Upstream A   | Upstream C
Upstream A   | Upstream B   | Upstream A
Upstream A   | Upstream B   | Upstream B
Upstream A   | Upstream B   | Upstream C
Upstream A   | Upstream C   | Upstream A
Upstream A   | Upstream C   | Upstream B
Upstream A   | Upstream C   | Upstream C
Upstream B   | Upstream A   | Upstream A
....
Upstream C   | Upstream C   | Upstream C

我开始时:

MATCH (s:STARTER)-[:owns]->(u:Upstream)
WITH s, u
MATCH (e:ENDER)-[:owns]->(d:Downstream)<-[:related]-(u)

但说实话,我不知道下一步该做什么。任何人都可以提供见解吗?

编辑:感谢@Dom Weldon,因为我忘记了这个名字。我正在寻找笛卡尔积

2 个答案:

答案 0 :(得分:1)

我不太确切地知道你在这里寻找什么,因为我不确定表中提到的组合是什么,但是,它听起来像你&#39;重新寻找是一种查找两个节点之间所有路径的方法。为此,您将运行以下查询。

MATCH p=((s:STARTER{name: 'start'})-[:owns|related]-(e:ENDER{name: 'end'}))
RETURN p

这应该会给你你想要的东西。否则,您可能希望构建一个笛卡尔积,这对于图数据库来说并不常见。

答案 1 :(得分:1)

Neo4j中的列(变量)对我来说不是动态的,所以你必须要明确。

这样的事情会起作用吗?

MATCH (:Downstream{name:'1'})<-[:related]-(u1)
MATCH (:Downstream{name:'2'})<-[:related]-(u2)
MATCH (:Downstream{name:'3'})<-[:related]-(u3)
RETURN u1, u2, u3
ORDER BY u1.name, u2.name, u3.name

您可以根据需要为列添加别名,但是u1将对应于下游1的上游节点,依此类推2和3。