2016-08-19 8 views
1

私は立法共同スポンサーシップを説明するデータセットを作成しています。私は法案の名前、それを共同スポンサーした立法者の数、そして共和党員である共スポンサーの数と民主党員である人の数で表を返そうとしています。私はこれが簡単でなければならないと感じていますが、構文エラーが出ています。ここで私がこれまで持っているものです。特定のプロパティを持つノードをカウントする

MATCH (b:Bill{Year:"2016"})-[r:COAUTHORED_BY|COSPONSORED_BY|SPONSORED_BY]-(c:Legislators) 
WHERE b.name CONTAINS "HB" OR b.name CONTAINS "SB" 
RETURN b.name, b.Short_description, COUNT(r) AS TOTAL, COUNT(c.Party = "Republican"), COUNT(c.Party = "Democratic") 
ORDER BY COUNT(r) desc 

しかし、テーブルにこのクエリは、共和党と民主党のスポンサーの数と総スポンサーの数を生成し、すべて同じです。明らかに、RepとDemのスポンサーの数の合計は合計に等しくなければならない。

このクエリの正しい構文は何ですか?

+0

を同じ議員が共著者とスポンサーやcosponser両方できますか?私は、これが事実である可能性がある場合、同じ人を2度カウントしたくないと思います。 – InverseFalcon

答えて

1

は、フィルタを使用します

MATCH (b:Bill{Year:"2016"}) 
     -[r:COAUTHORED_BY|COSPONSORED_BY|SPONSORED_BY]- 
     (c:Legislators) 
WHERE b.name CONTAINS "HB" OR b.name CONTAINS "SB" 
WITH b, collect(distinct c) as Legislators 
RETURN b.name, 
     b.Short_description, 
     SIZE(Legislators) AS TOTAL, 
     SIZE(FILTER(c in Legislators WHERE c.Party = "Republican")) as Republican, 
     SIZE(FILTER(c in Legislators WHERE c.Party = "Democratic")) as Democratic 
ORDER BY TOTAL desc 
0

これはグラフモデルの問題です。ノードのプロパティでノードをカウントしないでください。ノードによっては同じプロパティがあり、このプロパティでカウントしたい場合は、パーティを設定する中間ノードを作成する必要があります:

(b:Bill)-[:SPONSORED_AUTHORED]->(i:Intermediate)-[:TARGET]->(c:Legislators) 

、その後、あなたはあなたの中間ノードと党との関係を作成します。

(i:Intermediate)-[:BELONGS_PARTY]->(p:Party{name:"Republican"}) 

中間ノードは、あなたが実際にあなたの関係を持っているが、それはあなたが間の関係を作成することを可能にするデータを表し、あなたのオペラパーティーに参加して、カウントを簡単かつ迅速に行うことができます。

これは単なる例であり、コンテキストを知らずに、私は中間の実数ラベルとそのプロパティになるべきものがわからないことに注意してください。それは概念のデモです。

私は(それが理解しやすいかもしれない、実際の生活の例です)、それをチェックすること自由に感じ、これを使用して質問に答え:Neo4j can I make relations between relations?

+0

あなたは、私の現在のデータ構造でやりたいことをすることはできないと言っていますか?私のオプションは、データベースを再構築するか、データをエクスポートして、他のソフトウェアを使用して私が望むテーブルを作成するかのどちらかです。 – Matt

+0

これは可能だと思いますが、おそらくフィルターメソッドを使って、どうやってどうやっているのでしょうか。私はこれが最善の解決策ではないと言います;) – Supamiu

0

を議員がONLY共和党や民主党できると仮定すると(私たちが行う必要がありますいくつかの調整そうでない場合):

MATCH (b:Bill{Year:"2016"}) 
WHERE b.name CONTAINS "HB" OR b.name CONTAINS "SB" 
WITH b 
OPTIONAL MATCH (b)-[:COAUTHORED_BY|COSPONSORED_BY|SPONSORED_BY]-(rep:Legislators) 
WHERE rep.Party = "Republican" 
OPTIONAL MATCH (b)-[:COAUTHORED_BY|COSPONSORED_BY|SPONSORED_BY]-(dem:Legislators) 
WHERE dem.Party = "Democratic" 
WITH b, COUNT(DISTINCT rep) as reps, COUNT(DISTINCT dem) as dems 
RETURN b.name, b.Short_description, reps + dems AS TOTAL, reps, dems 
ORDER BY TOTAL desc 
関連する問題