Neo4j で「友達の友達」タイプの MATCH を実行しています。私をうんざりさせているのは、すべての関係を日付で制限しようとすることだけです。
基本的なグラフは次のようになります。
グラフの「実際の」バージョンには、10 人の第 1 度の友人と 3385 人の第 2 度の友人がいます。
上の画像の各エッジに日付プロパティを配置しませんでしたが、実際にそうです。どの日付にも順序はありません。
一般的な考え方は非常に単純です。あらかじめ決められた最大日付よりも古い日付プロパティを持つ関係は無視するようにします。
少しトリッキーな部分は、最初のリレーションシップ内で最大日付の制約に違反した場合 (上の画像のノードから外れている 3 つのエッジの 1 つなど)、そのエッジは半分に分割され、そのパスを他のトラバーサルは行わないことです。発生できるはずです。(たとえば、葉ノードは必要ありません)。
私はこれを書きました:
MATCH
(n)-[f1:FRIEND]-()-[f2:FRIEND]-(m)
WITH n, m,split('1962-1-1', '-') AS maxdate
WHERE n.person_id='180'
AND(
(
toInt(maxdate[0]) > toInt(split(f1.date, '-')[0])
)
OR
(
toInt(maxdate[0]) = toInt(split(f1.date, '-')[0])
AND
toInt(maxdate[1]) >= toInt(split(f1.date, '-')[1])
))
AND(
(
toInt(maxdate[0]) > toInt(split(f2.date, '-')[0])
)
OR
(
toInt(maxdate[0]) = toInt(split(f2.date, '-')[0])
AND
toInt(maxdate[1]) >= toInt(split(f2.date, '-')[1])
))
RETURN m;
このコード ブロックは約 20 分間実行され、最終的には私が目指していたものに近い結果になったようです。ブラウザでの表示は次のとおりです。
(ノード数は 350)
最初に、これが明らかにひどく書かれたコードであることを認めます (美学とパフォーマンスの両方の点で)。2 つ目は、境界に関連付けられていないノードがあることに気付きました。
私が考えているのは、1親等の関係の日付条件が失敗した場合ですが、2親等の関係では失敗したため、含まれたくない「友人の友人」になってしまいました。
1 次エッジが無効になったときにこれらの独立したノードを削除するように日付条件を変更するにはどうすればよいですか?
誰かが何か洞察を持っているなら、私はそれを大いに感謝します. (あまりどろどろにするつもりはありませんが、SO コミュニティのおかげで、私はすでに比較的かなり早くここまで来ました。そのため、感謝しています。)