遺伝子学のサイトでneo4jと遊んできました。Neo4Jノードトラバーサルサイファー各ノードの句
私は起動ノードを見つけるのが簡単ではないところに遭遇しました。ドキュメントやオンラインの投稿を見てみると、このことを暗示するものは見当たらず、おそらくそれは不可能かもしれません。
私がしたいのは、性別のリストを渡し、そのリストからノードを通過する特定のパスに従って単一ノードを取得することです。家族の文脈で
:
私は私の母の父の母の母を取得したいです。だから私は自分のIDを持っているので、そこから始めて4つのノードを辿るだろう。
ので、擬似問合せは、私が思った以上に簡単だった
select person (follow childof relationship)
where starting node is me
where firstNode.gender == female
AND secondNode.gender == male
AND thirdNode.gender == female
AND fourthNode.gender == female
今朝これについてもっと考えてみましょう。このクエリはn^2クエリになります。すべての可能な祖先につながるすべての可能なパスを比較します。私が間違っているなら私を訂正してください。一方、私がデータセットをループして、私の答えと同じようにクエリを構築すると、各レベルで関連するデータのみが表示されるため、パフォーマンスが大幅に向上します。それはnに近いでしょう。私はまだNeo4Jには新しいので、私は誤解を招く可能性があります。 –
あなたが祖先の世代になると仮定すると、_Σ(i = 1→n、2^i)の異なるパスがありますが、それらの_2^n_についてのみ比較されることを願っています。 Cypherエンジンは 'WHERE'節を並べ替えます)、長さ_n_のパスを構築するには、最初に_n-1_に構築する必要があります。特定のクエリを作成することにより、各世代で利用できる2つの正しいブランチを直接選択することができるため、祖先を遠く離れて行くとより速くなります。 –
この問題は、Cypherで再帰を行うことができないという事実に起因しています。そのため、一般的な解決方法は、カスタム作成された方法よりはるかに効率が悪くなります。それはあなたの呼び出しですが、(たとえパラメータ化されていれば)_n_世代までは別のクエリを構築するだけです。 –