首页 > 解决方案 > 通过完全连接合并/创建

问题描述

在 Neo4j 浏览器中,使用代码:

MATCH  (a:VAR1)<--(s:VARX {id: 'MYID'})-->(b:VAR2) RETURN a, b;

在图表视图中,我只看到 6 个节点

VAR1 id:A
VAR1 id:B
VAR1 id:C
VAR2 id:X
VAR2 id:Y
VAR2 id:Z

但在表格视图中,我看到了所有可能的组合:

VAR1.id VAR2.id
A       X
A       Y
A       Z
B       X
B       Y
B       Z
C       X
C       Y
C       Z

这是我想要的完整加入

但是基于此,我想为每个组合创建一个节点

VARY
{id1:"A",id2:"X"}
{id1:"A",id2:"Y"}
{id1:"A",id2:"Z"}
{id1:"B",id2:"X"}
{id1:"B",id2:"Y"}
{id1:"B",id2:"Z"}
{id1:"C",id2:"X"}
{id1:"C",id2:"Y"}
{id1:"C",id2:"Z"}

此外,所有这些节点都需要与它们的 2 个源节点建立关系

[VARY {id1:"A",id2:"X"}] -FROM-> [VAR1 {id:"A"}]
[VARY {id1:"A",id2:"X"}] -FROM-> [VAR2 {id:"X"}]

我尝试了很多与 UNWIND 的组合,很多 FOREACH,但没有运气,任何提示将不胜感激。谢谢你的时间。


更好地解释为什么我需要这个

我需要将 3 个信息链接在一起

VAR1 VAR2 VAR3
A    X    M
A    Y    P
A    Z    O
B    X    M
B    Y    Q
B    Z    O
C    X    M
C    Y    R
C    Z    O

如您所见,我需要构造 VAR1 和 VAR2 的笛卡尔积但是 VAR3 可以包含基于 VAR1 和 VAR2 的每种组合的不同值,正确的可视化实际上应该在这样的数据透视表中

    X   Y   Z
A   M   P   O
B   M   Q   O   
C   M   R   O 

转到 cypher,我将 VAR1、VAR2、VAR3 存储在独立节点中,为了不失去连接的可追溯性,我正在创建一个连接 3 个信息的节点。

基本上,VARX 正在过滤这些数据,我有:

VARX - [TOVAR1] -> VAR1(a)
VARX - [TOVAR1] -> VAR1(b)
VARX - [TOVAR1] -> VAR1(c)

VARX - [TOVAR2] -> VAR2(x)
VARX - [TOVAR2] -> VAR2(y)
VARX - [TOVAR2] -> VAR2(z)

VARX - [TOVAR3] -> VAR3(M)
VARX - [TOVAR3] -> VAR3(O)
VARX - [TOVAR3] -> VAR3(P)
VARX - [TOVAR3] -> VAR3(Q)
VARX - [TOVAR3] -> VAR3(R)

所以我对于单元格(1,1)需要将VAR1(a)和VAR2(x)和VAR3(M)的关系填充到另一个可以存储三元组(a,x,m)的独立节点中。所有 VAR1_n * VAR2_n 对 (VAR1,VAR2) 相同,在本例中为 3*3=9。

这对你有意义吗?

标签: neo4jcypher

解决方案


If you want to represent this table:

VAR1 VAR2 VAR3
A    X    M
A    Y    P
A    Z    O
B    X    M
B    Y    Q
B    Z    O
C    X    M
C    Y    R
C    Z    O

You can use a non-redundant data model with unique nodes. For example:

(:Var1)-[:T1]->(:Var3)<-[:T2]-(:Var2)

Here is some sample Cypher code for creating the (unique) nodes and relationships:

UNWIND [
  {id1: 'A', id2: 'X', id3: 'M'},
  {id1: 'A', id2: 'Y', id3: 'P'},
  {id1: 'A', id2: 'Z', id3: 'O'},
  {id1: 'B', id2: 'X', id3: 'M'},
  {id1: 'B', id2: 'Y', id3: 'Q'},
  {id1: 'B', id2: 'Z', id3: 'O'},
  {id1: 'C', id2: 'X', id3: 'M'},
  {id1: 'C', id2: 'Y', id3: 'R'},
  {id1: 'C', id2: 'Z', id3: 'O'}
] AS d
MERGE (v1:Var1 {id: d.id1})
MERGE (v2:Var2 {id: d.id2})
MERGE (v3:Var3 {id: d.id3})
MERGE p1=(v1)-[:T1]->(v3)
MERGE p2=(v2)-[:T2]->(v3)
RETURN p1, p2

推荐阅读