2017-05-04 26 views
1

Neo4jは作成時に関係方向を必要としますが、クエリ時にはこの方向を無視できます。このようにして、関係方向を無視してグラフを照会することができます。なぜneo4jは作成時に方向付けされた関係や双方向関係を許可しないのですか?

また、関係が自然に双方向であるか指示されていない場合の対処方法があります。like described here

私の質問はなぜこのように実装されていますか?作成時に指示や双方向の関係を許さないのは正当な理由ですか?それはデータベースアーキテクチャの限界ですか?以下のような

サイファー文は許可されていません。

CREATE()-[:KNOWS]-() 
CREATE()<-[:KNOWS]->() 

私は答えのためにウェブを検索するが、私は多くを見つけることができませんでした。たとえば、this github issueです。

それがない方向に関係の方向を定義する必要があることは奇妙です。私のグラフの意味を傷つけているようです。

EDIT 1:

"セマンティック問題" についての私の立場を明確にするために(多分用語が間違っている):

が、私はこの単純なCREATEステートメントを実行するとします。

CREATE (a:Person {name:'a'})-[:KNOWS]->(b:Person {name:'b'}) 

私はこの非常に単純なグラフを持っています:

Simple graph

:KNOWSの関係は、作成時にNeo4jに関係方向が必要なため、方向があります。私のドメインでabbaです。

今、新しいチームメンバーは、このサイファークエリで私のグラフを照会します:

MATCH path = (a:Person {name:'a'})-[:KNOWS]-(b:Person {name:'b'}) 
return path 

この新しいチームメンバーが、私はこのグラフを作成したとき、私は:KNOWS関係が向けられていないと考えていることを知りません。彼が表示されるという結果は同じです。

Simple graph

結果では、この新しいチームメンバーが考える唯一の人物が人物Bを知っていると考えることができます。それは私に悪いようです。あなたの為ではない?これは意味をなさない?

答えて

2

基本的に、データはNeo4jのディスクに格納されている方法の内部にまでわかります.O'Reilly Neo4jの電子書籍第6章を参照してください。

リレーションシップのデータ構造には、「firstNode」と「secondNode」があり、それぞれがリレーションシップの左側または右側のいずれかになります。

単一/双方向の関係にフラグを立てるには、ノードごとに追加のビットが必要です。データストア内の方向を保持し、クエリ中に方向を無視する方がよいと主張します。

+0

こんにちは@kuah!あなたの答えは、私が期待しているものに非常に近いです。私はこの本を読んでいて、近い将来にお勧めの章を読むでしょう!ありがとう! :) –

0

私はグラフの意味を傷つけているようです。あなたが一致する(したがって、無向/双方向のように、その関係を処理する時にそのシンボルを使用しないしようとしている場合、関係の作成時に使用<または>シンボルは、グラフの意味を痛いなぜ私が見ることができない

)。

あなたが提案した構文がサポートされているとします。ここで、無関係な関係の2つのノードにどのように接続しますかb?ペア(a, b)は常にセマンティクスによって出現によって命じても、されていない

  1. CREATE (a)-[:KNOWS]-(b)
  2. CREATE (b)-[:KNOWS]-(a)

:あなたはまだ2つのオプションがあります。したがって、関係宣言から<シンボルまたは>シンボルを削除しても、その中のノードの順序の問題を排除することはできません。したがって、単にそれを治療しないでください問題です。

+0

こんにちは@レオン!これについての私の立場を明確にしようと私の質問を編集しました!御時間ありがとうございます! –

1

In Neo4jの関係は常に指示されます。

しかし、方向を気にしなければ、クエリを実行するときに方向を無視することができます。

MATCH (p1:Person {name:"me"})-[:KNOWS]-(p2) 
RETURN p2; 

また、作成時にMERGEを使用して方向を去ることもできます。

MATCH (p1:Person {name:"me"}) 
MATCH (p2:Person {name:"you"}) 
MERGE (p1)-[:KNOWS]-(p2); 

実際に異なる意味を伝える場合は、2つの関係が必要です。 :FOLLOWSはTwitter上にあります。

+0

こんにちは@Michael Hunger。ご回答有難うございます!はい、私はクエリ時に関係が無視できることを理解しました。しかし、私の質問は、 "なぜ" Neo4jが作成時にkwahによって答えられたような方向性を必要とするかにあります。 –

関連する問題