質問
任意であるが特定のノード/関係(NEO4J 2.0 M6)を持つノード間の関係を見つけようとしています。
私のデータモデルでは、 '遺伝子'は 'A'のグループです。私は '遺伝子' - '遺伝子'、 '遺伝子' - 'group'および 'group' - 'group'(モデルイメージの赤い線)の間の関係を「対話」の関係を持っています。
これを「遺伝子」との間のすべての「対話」の関係に煮ることが望みます。直接(Gene-INTERACT-Gene)
と1つか2つのグループの(Gene-PARTOF-Group-INTERACT-Gene)
。
もちろん、これは複数の文字照会で簡単です:
# direct INTERACT
MATCH (g1:Gene)-[r:INTERACT]-(g2:Gene) RETURN g1, g2
# INTERACT via one Group
MATCH (g1:Gene)-[:PARTOF]-(gr:Group)-[r:INTERACT]-(g2:Gene) RETURN g1, g2
# INTERACT via two Group
MATCH (g1:Gene)-[:PARTOF]-(gr1:Group)-[r:INTERACT]-(gr2:Group)-[:PARTOF]-(g2:Gene)
RETURN g1, g2
.
しかし、パス内のオプションの「グループステップ」を受ける単一の文字列クエリを構築することが可能ですか?これまでのところ私はオプションの関係とshortestPaths
だけを使いましたが、私は2つの遺伝子の間に1つか2つのオプションのノードをフィルタリングできるかどうかはわかりません。
解決
パスに追加する関係ごとにゼロの間に深さを割り当てることができます。
のようなものを試してみてくださいMATCH (g1:Gene)-[:PARTOF*0..1]-(gr1)-[:INTERACT]-(gr2)-[:PARTOF*0..1]-(g2:Gene)
RETURN g1,g2
.
と一致したパスが実際にどのように見えるかを確認するには、パス全体を返します。
MATCH p=(g1:Gene)-[:PARTOF*0..1]-(gr1)-[:INTERACT]-(gr2)-[:PARTOF*0..1]-(g2:Gene)
RETURN p
.
このパターンのオプション部分についてノードラベルを宣言することで少し悩まされます。遺伝子が他のものに[:PARTOF]
を持つことができれば、(gr1)
はそのものにバインドし、クエリは信頼できません。
WHERE gr1:Group AND gr2:Group
.
オプションの部品が一致しない場合を除くので、機能しません(それはあなたの3番目のクエリのようなものです)。私はそれが解決できると確信していますが、あなたの実際のモデルがあなたの質問で説明しているものよりもはるかに複雑ではない場合は、これはそうです。
私はコンソールであなたのモデルを解釈する自由を取りましたここ、それを確認するそれがあなたが望むものをするならば。