2017-06-25 7 views
1

私があなたを助けてくれることを願っています。私は、すべての隣人がすべてのノードを関係のタイプによって精神的に評価したいと思っています。すべての隣接ノードをリレーションでソートしたすべてのノードを返す方法

enter image description here

は、私は、次のノード165のために取得したい:私はこのグラフなった場合たとえば 私はこのクエリを作っ

id  AnzTaxi AnzBus AnzSchiff 
165 2   2  0 

が、それはのNeo4jのように思えるがと私の「マッチ」を結びますANDとすると、すべてのタイプで少なくとも1つの関係を持つノードのみがリストされます。

MATCH (Station)-[:TAXI]-(b) 
MATCH (Station)-[:BUS]-(c) 
MATCH (Station)-[:SCHIFF]-(d) 
RETURN Station.id, COUNT(DISTINCT b) AS AnzTaxi, 
COUNT(DISTINCT c) AS AnzBus, COUNT(DISTINCT d) AS 
AnzSchiff 
ORDER BY COUNT(DISTINCT b) DESC; 

事前に感謝します。

答えて

4

MATCHの代わりにOPTIONAL MATCHを使用してください。ドキュメントは言う:

オプションMATCH句がパターンを検索するために使用されるパターンの欠落部分に対してヌルを使用しながら、それに を説明しました。

それを試してみてください。

OPTIONAL MATCH (Station)-[:TAXI]-(b) 
OPTIONAL MATCH (Station)-[:BUS]-(c) 
OPTIONAL MATCH (Station)-[:SCHIFF]-(d) 
RETURN Station.id, COUNT(DISTINCT b) AS AnzTaxi, 
COUNT(DISTINCT c) AS AnzBus, COUNT(DISTINCT d) AS 
AnzSchiff 
ORDER BY COUNT(DISTINCT b) DESC; 
+0

多くの感謝!それはうまくいった! – Steuerfahndung

2

別のアプローチは、隣接一度のノードではなく、3つの別々のオプションのすべての文に一致するようになります。この結果、結果がなければ、TAXI,バスまたはSCHIFFによって接続された隣人がないことがわかります。次に、CASEステートメントを使用して、事後にそれらを区切り、SUMを使用してバックアップを集約することができます。

MATCH (s1:Station)-[mode:TAXI|BUS|SCHIFF]-(neighbour) 
WITH s1, 
    TYPE(mode) as mode, 
    COLLECT(DISTINCT neighbour) as neighbours 
WITH s1, 
    CASE WHEN mode = 'TAXI' THEN size(neighbours) END AS AnzTaxi, 
    CASE WHEN mode = 'BUS' THEN size(neighbours) END AS AnzBus, 
    CASE WHEN mode = 'SCHIFF' THEN size(neighbours) END AS AnzSchiff 
RETURN s1.id, 
    SUM(AnzTaxi) as AnzTaxi, 
    SUM(AnzBus) AS AnzBus, 
    SUM(AnzSchiff) AS AnzSchiff 
ORDER BY AnzTaxi DESC, s1.id 
+0

ありがとう、これは面白そうだ、私はそれを試してください。 – Steuerfahndung

3

1つの追加のアプローチは全く展開し、必要な数を取得する(ノード自体に保存されている)の関係度を使用することではありません。

MATCH (Station) 
RETURN Station.id, 
size((Station)<-[:BUS]-()) AS AnzBus, 
size((Station)<-[:TAXI]-()) AS AnzTaxi, 
size((Station)<-[:SCHIFF]-()) AS AnzSchiff 
ORDER BY AnzBus DESC; 

これは関係なく、ノードをカウントし、これはすべてのことを(あなたの例から)を前提としていること注:バス、タクシー、および:グラフでシッフ関係は各接続ノードとの間の着信および発信の関係の両方を有します。

ノード間の1つの関係でこれをモデル化し、関係を不必要に二倍にするのではなく双方向として扱うほうがよいでしょう(変更を行う場合は、ノードから方向を削除する必要があります)。私の質問の関係)。

モデルがこのように動作せず、関係は一方向に進むことができますが、往復することはできません(ノードへの送信:BUS関係がありますが、同じノードからのBUS関係)、この答えはうまくいかず、あなたは他の一つを選ぶべきです。

+0

これは、OPが本当にネイバーノードを望んでいない場合(元のクエリの場合のように思われます)、実際には最高です。 –

+0

ありがとう、これは良いだろうが、私のモデルはいくつかの一方向の関係を持っています:( – Steuerfahndung

関連する問題