3

各ノードが Java クラスを表し、それぞれが名前空間と呼ばれるプロパティを持つグラフがあります。開始ノードと最終ノードが名前空間を共有しているが、すべての中間ノードがその名前空間を共有していないパターンに一致させたい。3つのクラス(クラスA - >クラスB - >クラスC)がある場合、私は持っています:

START inside1 = node(*) 
match inside1 -[:USES]-> outside1 -[:USES] -> inside2  
where inside1.namespace <> outside1.namespace 
  and inside2.namespace = inside1.namespace  
return inside1.name, outside1.name, inside2.name

これはうまくいくようです。拡張しようとしたときに、次のことを試しました。

START inside1 = node(*) 
match inside1 -[:USES]-> outside1 -[:USES*] -> inside2  
where inside1.namespace <> outside1.namespace 
  and outside1.namespace <> inside1.namespace 
  and inside2.namespace = inside1.namespace  
return inside1.name, outside1.name, inside2.name

問題は、中間ノードが inside1 と同じ名前空間を共有するパスが必要ないことです。だから私の質問は、「名前空間がinside1.namespaceと等しいノードにヒットしたときに停止する」と言うことができる方法はありますか?

ありがとう。

4

1 に答える 1

3

それが最も簡潔かどうかはわかりませんが、これはあなたが望むものだと思いますか? 最初にクエリの一般的なケースを取得し、match次にwith.

 START inside1 = node(*) 
 MATCH inside1-[:USES*]->outside1-[:USES]->inside2 
 WHERE inside1.ns <> outside1.ns 
   AND inside2.ns = inside1.ns 
  WITH inside1, inside2, outside1 
 MATCH inside1-[:USES]->outside2 
 WHERE inside1.ns <> outside2.ns 
RETURN inside1, outside1, inside2

http://console.neo4j.org/r/m8iqo5

于 2012-09-22T07:00:50.780 に答える