Neo4j 在完全联接上合并/创建

Neo4j 在完全联接上合并/创建,neo4j,cypher,Neo4j,Cypher,在Neo4j浏览器中,使用以下代码: MATCH (a:VAR1)<--(s:VARX {id: 'MYID'})-->(b:VAR2) RETURN a, b; 但在表视图中,我看到了所有可能的组合: VAR1.id VAR2.id A X A Y A Z B X B Y B Z C X C Y C Z 这是我想要的完整连接 然而,基于此,我想为每个单独的组合创建一个节

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

MATCH  (a:VAR1)<--(s:VARX {id: 'MYID'})-->(b:VAR2) RETURN a, b;
但在表视图中,我看到了所有可能的组合:

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"}]
我尝试了这么多与放松的组合,这么多的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的笛卡尔积 然而,基于VAR1和VAR2的每个组合,VAR3可以包含不同的值,正确的可视化事实上应该在这样的透视表中

    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),I需要在另一个可以存储三元组(a,x,M)的独立节点中填充VAR1(a)、VAR2(x)和VAR3(M)的关系。对于所有的VAR1_n*VAR2_n对(VAR1,VAR2)也是一样的,在本例中3*3=9


这对您有意义吗?

如果要表示此表:

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)-[:T1]->(:Var3)<-[:T2]-(:Var2)

你能解释一下你为什么要这样做吗?这会给数据库添加大量冗余信息,除非有真正的需要,否则这是不可取的。您好,@cybersam!其思想是创建派生节点并将其链接回源节点。对于其中的每一个,我希望稍后为节点设置更多标签。我尝试了某种foreach组合,比如foreach(VAR1 | foreach中的节点(VAR2 | MERGE VARY{id1:VAR1.id,id2 VAR2.id}-[:FROM]>VAR1{id:VAR1.id},VARY{id1:VAR1.id,id2 VAR2.id}-[:FROM]>VAR2{id:VAR2.id}),但是我找不到一个合适的语法。尽管你想做的是可能的,冗余存储数据通常是一种反模式。它不仅消耗了更多的存储空间,而且使代码更加复杂。在一个位置添加/删除/更新冗余数据时,需要编写额外的代码,以确保所有其他副本和数据库的其余部分保持一致(如果可以同时发生多个事务,则可能是原子级的)。你需要有一个真正的需要来证明冗余的合理性(比如一个关键的用例,它需要最大的速度,这是其他WSIE不可能做到的)。@cybersam我有语法来工作,但是因为你提出了一个好的观点,我正在添加更多的信息,这样你就可以看看我为什么需要这个:)
(:Var1)-[:T1]->(:Var3)<-[:T2]-(:Var2)
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