2016-04-21 25 views
0

でよく接しているグラフから戻ります。この質問は、私が以前に尋ねた質問here(さらに以前のバージョンhere)の直接の拡張です。プロパティの数がnより大きい場合は、Neo4j

は、私はこのようになりますグラフデータベースを持っていると言う:

enter image description here

ちょうど私が尋ねた前回の質問のように、このことについてだけは本当に興味深いのは、SomePropertyは、「はい」または「いいえことができるということです'

3つのノードのうちの1行に、このプロパティの「はい」があります。

5つのノードのうち3つのノードには、このプロパティで「はい」があります。

わずかな哲学的追記:。?。私はこれは悪いグラフスキーマであることを疑うに始めているノードの各セットの中に、各ノードは他のすべてのノードに接続している、のでなぜ私は心配していません2つのグループのグループがあるという事実については、私はこのグラフを作成したときに、「返された530行」というトークバックを得ました。これは実際にグラフ構造内に530のサブパスを作成したことを意味し、 。)

とにかく、私が解決しようとしている問題は、以前の単純でよりリニアなコンテキストhereで解決しようとしていた問題とほとんど同じです。

私はどこにも内がSomePropertyの発生をカウントグラフは、私は、これは一般的な、簡単な問題であると思うだろう2.

以上であると述べたのに対し、これらのばらばらのグラフのいずれかの完全なパスを返すようにしたいです。たとえば、2人の無関係な家族がいて、誰かが「私に家族と一緒に私に2人以上の左利きの人がいる」と言う人がいます。

この問題のシンプルな化身、の線に沿って何かをお勧めスーパースマート#cybersam:グラフは直線のより多くのに似ている、とdoesnの場合は素晴らしい作品

MATCH p=(a:person)-[:RELATED_TO*]->(b:person) 
WHERE 
    NOT()-[:RELATED_TO]->(a) AND 
    NOT (b)-[:RELATED_TO]->() AND 
    2 < REDUCE(s = 0, x IN NODES(p) | CASE WHEN x. SomeProperty = 'Yes' THEN s + 1 ELSE s END) 
RETURN p; 

...」セット内の各ノードは互いのノードに関連しています。

#cybersamのクエリがこのより複雑なグラフを処理しない理由は、終端ノードがないためです。

もう一つの哲学的追記:。私は、これは使用双方向性によるものかもしれないと思うのグラフの密な、複雑な関係は、性能だけでなく、照会して、組合せ問題を提起することを理論を考え出す始めています質問するとCypherによって)?

ここに私のデータがあります。どんなアドバイスも感謝しており、私が学習曲線を上げるのを助けてくれてありがとう。そのように、各関係グループのために家族ノード:

// match (n) detach delete n; 

CREATE (albert:person {gender: 'Male', name: 'Albert', SomeProperty: 'Yes'}) 
CREATE (annie:person {gender: 'Female', name: 'Annie', SomeProperty: 'No'}) 
CREATE (adrian:person {gender: 'Female', name: 'Adrian', SomeProperty: 'No'}) 

CREATE (albert)-[:RELATED_TO]->(annie) 
CREATE (annie)-[:RELATED_TO]->(albert) 
CREATE (annie)-[:RELATED_TO]->(adrian) 
CREATE (adrian)-[:RELATED_TO]->(annie) 
CREATE (albert)-[:RELATED_TO]->(adrian) 
CREATE (adrian)-[:RELATED_TO]->(albert) 


CREATE (bill:person {gender: 'Male', name: 'Bill', SomeProperty: 'Yes'}) 
CREATE (barb:person {gender: 'Female', name: 'Barb', SomeProperty: 'Yes'}) 
CREATE (barry:person {gender: 'Male', name: 'Barry', SomeProperty: 'Yes'}) 
CREATE (bart:person {gender: 'Male', name: 'Bart', SomeProperty: 'No'}) 
CREATE (bartholemu:person {gender: 'Male', name: 'Bartholemu', SomeProperty: 'No'}) 

CREATE (bill)-[:RELATED_TO]->(barb) 
CREATE (barb)-[:RELATED_TO]->(bill) 
CREATE (barb)-[:RELATED_TO]->(barry) 
CREATE (barry)-[:RELATED_TO]->(barb) 
CREATE (barry)-[:RELATED_TO]->(bart) 
CREATE (bart)-[:RELATED_TO]->(barry) 
CREATE (bart)-[:RELATED_TO]->(bartholemu) 
CREATE (bartholemu)-[:RELATED_TO]->(bart) 
CREATE (bill)-[:RELATED_TO]->(bartholemu) 
CREATE (bartholemu)-[:RELATED_TO]->(bill) 
+0

:そうようperson.SomeProperty =「はい」家族:あなたはその後、十分に持っている家族のグループを選ぶことができますあなたが必要と考えるソリューションの代わりに解決しようとしていますか? –

+0

あなたの前の質問であなたが求めていたのは終端ノードがありません。 WHERE/NOT条件を取り除くと、端末ノードのフィルタリングがなくなります。 –

答えて

1

これは人の家族についてです場合は、最も簡単な修正は追加することです

create (f:Family) with f 
match (a:person {name:"Adrian"})-[:RELATED_TO*]->(b:person) 
merge (f:Family)<-[:FAMILY]-(a) 
merge (f:Family)<-[:FAMILY]-(b) 

作成するには、「バリー」と「エイドリアン」を置き換え第二の家族グループ。

これは、各ファミリーグループの中央:ファミリーノードを提供します。あなたは問題があなたにあるものを私たちに伝えることができ、むしろ試してみて、あなたの質問の他のバリエーションと格闘より

// Find families with 2 or more :person.SomeProperty = "yes" 
match p = (f:Family)<-[:FAMILY]-(psn:person) 
where psn.SomeProperty = "Yes" 
with f, count(psn) as cnt 
where cnt > 2 

// Get the family members 
match (a:person)<-[r1:RELATED_TO]-(b:person)-[r2:RELATED_TO*]->(c) 
where (a)-[:FAMILY]-(f) 
    and a = c // to get all the nodes in the loop 

// report the first record which'll have two 
// family members and all the relationships 
return a, r1, b, r2 
limit 1 
+0

ありがとうございます!ほぼ完璧に動作します。私が考えていない創造的なアイデアです。各ノードに新しいノードを追加することで、各ノードが隔離されていることを示すことができます。唯一の問題は、新しいノードの1つがビルドされておらず、クエリが永遠に実行されていることです... http://stackoverflow.com/questions/36781902/query-performance-when-adding-a-new-node-in -neo4j –

+0

ようこそ!これがうまくいくなら、答えとしてそれをマークし、upvoteを与えてください。 :) –

関連する問題