サイファーを介して関係を作成する方法に混乱しています。_src-[:likes]- _dst は双方向の関係を作成するという印象を受けましたが、_src-[:likes]- _dst == _src<-[:likes]- _dstのようにそうではないようです(例を以下に示します)。 )
次のグラフを作成するとしますが、_src[:likes] - _dst 表記 ( 「->」ではなく「-」を使用)を使用します。
create
(_u1 {type:"User",`name`:"u1",userId:'u1' }) , ( _u2 {type:"User",`name`:"u2",userId:'u2'} ) , ( _u3 {type:"User",`name`:"u3",userId:'u3' }) , ( _u4 {type:"User",`name`:"u4",userId:'u4' }) , ( _u5 {type:"User",`name`:"u5",userId:'u5'}) , (_u6 {type:"User",`name`:"u6",userId:'u6'}),
(_f1 {type:"Item",`name`:"f1",itemId:'f1' }) , ( _f2 {type:"Item",`name`:"f2",itemId:'f2' }) , ( _f3 {type:"Item",`name`:"f3",itemId:'f3' }) , ( _f4 {type:"Item",`name`:"f4",itemId:'f4'}) , (_f5 {type:"Item",`name`:"f5",itemId:'f5'}),
_u1-[:`likes`{likeValue:3}]-_f1 , _u1-[:`likes` {likeValue:13}]-_f2 , _u1-[:`likes` {likeValue:1}]-_f3 , _u1-[:`likes` {likeValue:5}]-_f4,
_u2-[:`likes`{likeValue:7}]-_f1 , _u2-[:`likes` {likeValue:13}]-_f2 , _u2-[:`likes` {likeValue:1}]-_f3,
_u3-[:`likes`{likeValue:5}]-_f1 , _u3-[:`likes` {likeValue:8}]-_f2 , _u4-[:`likes`{likeValue:5}]-_f1
,_u5-[:`likes` {likeValue:8}]-_f2,_u6-[:`likes` {likeValue:8}]-_f2;
私の印象では、neo4j に双方向の関係を作成するように指示します。さて、次のクエリを見てください
neo4j-sh (?)$ start n=node(*) match n-[:likes]->m where has(n.type) and n.type='User' return n,m;
==> +-------+
==> | n | m |
==> +-------+
==> +-------+
==> 0 row
しかし、その逆が機能します
neo4j-sh (?)$ start n=node(*) match n-[r]->m where has(n.type) and n.type="Item" return n,m limit 3;
==> +-----------------------------------------------------------------------------------------+
==> | n | m |
==> +-----------------------------------------------------------------------------------------+
==> | Node[7]{type:"Item",name:"f1",itemId:"f1"} | Node[4]{type:"User",name:"u4",userId:"u4"} |
==> | Node[7]{type:"Item",name:"f1",itemId:"f1"} | Node[3]{type:"User",name:"u3",userId:"u3"} |
==> | Node[7]{type:"Item",name:"f1",itemId:"f1"} | Node[2]{type:"User",name:"u2",userId:"u2"} |
==> +-----------------------------------------------------------------------------------------+
問題は、なぜ a-[:likes]-b = a<-[:likes]-b なのかということです。
ここで、Cypher マニュアルの指示に従って、さらに 2 つのノードと関係を作成します。
create (_u7 {type:"User",`name`:"u7",userId:'u7' });
create (_f7 {type:"Item",`name`:"f7",itemId:'f7' });
start src=node(*),dst=node(*) where src.name='u7' and dst.name='f7' create src-[:likes{likeValue:3}]-dst;
neo4j-sh (?)$ start n=node(*) match n-[r]->m where has(n.type) and n.type="User" return n,m limit 3;
==> +-------+
==> | n | m |
==> +-------+
==> +-------+
==> 0 row
同じ結果です。ユーザーからアイテムにクエリを実行することはできませんが
、次の方法を使用するとアイテムからユーザーにクエリを実行できます。
create (_u {type:"User",`name`:"u8",userId:'u8' }) , ( _f {type:"User",`name`:"f8",userId:'f8'} ), _u-[:likes{likeValue:2}]-_f;
neo4j-sh (?)$ start n=node(*) match n-[r]->m where has(n.type) and n.type="User" return n,m limit 3;
==> +-------------------------------------------------------------------------------------------+
==> | n | m |
==> +-------------------------------------------------------------------------------------------+
==> | Node[19]{type:"User",name:"f8",userId:"f8"} | Node[18]{type:"User",name:"u8",userId:"u8"} |
==> +-------------------------------------------------------------------------------------------+
何が起こっている?これらは私の質問
です 1- create _src-[:likes]-_dst が双方向の関係を作成しないのはなぜですか?
2- それができない場合、関係の作成に _src-[:likes]-_dst を許可するのはなぜですか? 人間関係を構築する際に、人々に道順を使用するように強制しないのはなぜですか?
3- リレーションシップを作成するために使用した 2 つの方法の違いは何ですか? ( u7-f7とu8-f8 )