neo4j - 通过完全连接合并/创建
问题描述
在 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。
这对你有意义吗?
解决方案
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
推荐阅读
- vba - 在连续表单上获取控件或记录集值
- android - 由于内核映像文件 (kernel-ranchu),Android Emulator API 24 无法启动
- java - Java:使用正则表达式按十六进制字节拆分十六进制字符串
- python-3.x - 使用 PyQt 显示 Raspberry Pi GPIO 读数
- solr - SOLR - 节点:2个库中的冲突
- r - R Shiny plotly DT 表交互
- windows - “RESULT_CODE_MISSING_DATA”在 Win10 的 Chromium 构建启动
- c++ - 自定义前置条件对移动赋值运算符有效吗?
- javascript - 映射到 React 中的函数
- r - 如何使用 R 连接来自不同对象的名称?