2017-01-26 9 views
2

私は部分グラフを作成する際にグラフの効果的なプルーニングに使用するプロパティがある大きなグラフを持っています。たとえば、'relevance score'というプロパティがあり、1つのノードから開始し、すべてのノードとリレーションシップを収集し、関係が上記のプロパティを持つ場合はどこでもプルーニングしたいと考えています。where節を使用してNeo4j内の特定の部分グラフを見つける方法

そうする私の試みは、このクエリを相殺:

start n=node(15) match (n)-[r*]->(x) WHERE NOT HAS(r.relevance_score) return x, r 

私の試みは二つの問題を私が解決することはできませんがあります。私は、これは剪定グラフにはなりません信じるのではなく、コレクション反映

1)不連続グラフのさらに:

2)私が正しく形成されCYPHERクエリであることを見えるものから、次のエラーを取得しています:私は考えることができる

Type mismatch: expected Any, Map, Node or Relationship but was Collection<Relationship> (line 1, column 52 (offset: 51)) 
"start n=node(15) match (n)-[r*]->(x) WHERE NOT HAS(r.relevance_score) return x, r" 
+2

どのバージョンのNeo4jを使用していますか? ['START'](https://neo4j.com/docs/developer-manual/3.0/cypher/#query-start)は廃止予定とみなされ、[' has'](https://neo4j.com/docs/developer -manual/3.0/cypher /#where-property-exists)は、3.xではサポートされなくなりました。 –

+0

3.0.6。それは他のクエリではまだ動作しますが、知っておくとよいです。私は文書のその点を逃した – WildBill

答えて

3

リレーションシップのコレクションでALL()関数を使用して、パス内のすべてのリレーションシップに対して問題のプロパティがnullであることを強制できます。

Gaborのサンプルグラフを使用すると、このクエリが機能するはずです。

MATCH p = (n {name: 'n1'})-[rs1*]->() 
WHERE ALL(rel in rs1 WHERE rel.relevance_score is null) 
RETURN p 
+1

ありがとう、私はそれを考えなかった。軽微な発言: 'path'ではなく' p'を返すべきです。 –

+0

これは動作しますが、関係に関するデータを取得できないようです。私は「関係(p)」のようなことをすることができますが、私はプロパティだけが戻り値であり、IDやラベルのようなものは取得できません。 – WildBill

+0

私はこれを受け入れるつもりですが、私は各部の詳細が必要なので新しい質問を開きますが、私はそれを明示的に言っていません。 http://stackoverflow.com/questions/41895481/how-to-enumerate-nodes-and-relationships-along-path-returned-via-cypherを開いて質問を洗練させました。 – WildBill

2

一つの解決策は、rs*とのすべての関係()を通過することです、 relevance_scoreプロパティのないものをフィルタリングして、rs "path"がまだ同じかどうかを確認してください。 (私は技術的に「パス」を引用していますが、それはNeo4j pathではありません)。

CREATE 
    (n1:Node {name: 'n1'}), 
    (n2:Node {name: 'n2'}), 
    (n3:Node {name: 'n3'}), 
    (n4:Node {name: 'n4'}), 
    (n5:Node {name: 'n5'}), 
    (n1)-[:REL {relevance_score: 0.5}]->(n2)-[:REL]->(n3), 
    (n1)-[:REL]->(n4)-[:REL]->(n5) 

グラフは、ノードn1n2との間に、単一の関連するエッジが含ま:

Iは小さな例グラフを作成しました。

MATCH (n {name: 'n1'})-[rs1*]->(x) 
UNWIND rs1 AS r 
WITH n, rs1, x, r 
WHERE NOT exists(r.relevance_score) 
WITH n, rs1, x, collect(r) AS rs2 
WHERE rs1 = rs2 
RETURN n, x 

結果:

╒══════════╤══════════╕ 
│n   │x   │ 
╞══════════╪══════════╡ 
│{name: n1}│{name: n4}│ 
├──────────┼──────────┤ 
│{name: n1}│{name: n5}│ 
└──────────┴──────────┘ 

更新:

enter image description here

クエリ(私は、あなたがSTART node=...を使用する可能性があります開始ノードを取得するために{name: 'n1'}を使用していることに注意してください)より単純な解決法のInverseFalconの答えを参照してください。

+0

私は以下の答えに注意書きで洗練されたを投稿した。私はパスの結果のコンポーネントについてより多くのデータをどのように取得するのか興味があります。 – WildBill

関連する問題