2つのタイプのエッジで互いに接続されているノードの直後と直後を考えてみましょう。直接縁 の間とすることができるエッジが交差するエッジ Neo4j:適時に複数の関係と一致
- 0..N直接縁
- 0..1:クエリはすべて、以下の規則を満足する2つのノード間のすべての可能な経路を発見する必要があります
これらのパスは、ノードAとnodeZの間で有効と見なされます。
(nodeA)-[:direct]->(nodeB)-[:direct]->(nodeC)->[:direct]->(nodeZ)
(nodeA)-[:direct]->(nodeB)->[:direct]->(nodeC)-[:intersect]->(nodeZ)
(nodeA)-[:direct]->(nodeB)-[:intersect]->(nodeC)->[:direct]->(nodeZ)
(nodeA)-[:intersect]->(nodeB)-[:direct]->(nodeC)->[:direct]->(nodeZ)
MATCH (from)-[:direct*0..N|:intersect*0..1]->(to)
しかし:(エッジタイプのために複数の制約をのNeo4jサポートしていません
UPDATE 23.04.16
6609個のノード(合計550kのうち)、5184個の直接のタイプ(合計440kのうち)と34119のタイプの交差(37289個のうちの合計)です(いくつかの循環参照が予想されます(neo4jは回避しますか? ?)
有望に見えたが、秒の形で終えることができなかったクエリ:
MATCH p = (from {from: 1})-[:direct|intersect*0..]->(to {to: 99}) WHERE 123 < from.departureTS < 123 + 86400 //next day AND REDUCE(s = 0, x IN RELATIONSHIPS(p) | CASE TYPE(x) WHEN 'intersect' THEN s + 1 ELSE s END) <= 1 return p;
あなたのお問い合わせが記載された要件に準拠していません。少なくとも1つの 'direct'で始まり、1つの' intersect'に続いて、最後に少なくとも1つの 'direct'が続くパスを返します。しかし、正しく動作するように変更することもできます(しかし、私の答えと同じくらいパフォーマンスは良くないかもしれません):MATCH p =((from) - [:direct * 0 ..] - >(middle) - [:intersect * 0。 (0)] - >(to))戻り値DISTINCT p; ' – cybersam
これには、グラフに交差するエッジが存在するという唯一の要件があります。交差エッジもオプションの場合、[:intersect]は[:intersect *]に置き換えることができます。 –
'intersect'は必須ではなく[0..1]、' direct' [0..N]でもありません。パスは「直接」で始まり、終わらなければならないという要件はありません。 – cybersam