2017-01-25 10 views
0

Iは問題があるのNeo4jは、そこにノードAの数、B、C、D 親

B-->A 
C-->B 
D-->B 

と関係彼らの間には子供たちがいる。

今、私はボットアプリケーションを作っていますグラフ

の下部に存在するノードのラベル(B、C、D)のリストからのことを見つけることのNeo4jを照会します。 neo4jでは、データベースの関係はさまざまな用語の間に格納されます。

Like :dog-->:animal 
    :labra-->:dog 
    :germanShepard-->:dog 

ユーザーがqustionは犬を教えて要求された場合さて、私は犬のラベルデータを得ることができる必要があり、ユーザーがlabra犬を教えて尋ねるならば、私はlabraラベルdata.Iを得ることができる必要がありますユーザー入力をトークンに分割し、次にどのラベルが下部にあるのかを調べようとしています。

+0

A、B、C、Dは本当に[ラベル](https://neo4j.com/developer/guide-data-modeling/#_labels)ですか、それとも単に「識別子」なのでしょうか? – cybersam

+0

グラフの一番下にあるのはどういう意味ですか?関係は方向性がありますが、その方向を除いて他の意味はありません。また、既に[開発者向けドキュメント](http://neo4j.com/docs/developer-manual/3.1/)を見てきましたか?あなたが基本を最初に熟知していないなら、良い質問をすることはしばしば難しいです。 – InverseFalcon

+0

はいA、B、C、Dはラベル名 –

答えて

0

あなたは

Match (a:Label) where not (a)<--(:Label) return a 

ような何か試すことができます(動作するはずですが、私はそれをテストしていない)すべての単一のノードに一意のラベルを使用して、私のコメントで述べたように

0

コストがかかることになるだろう長い目で見れば、クエリの検索速度に影響を与えます。

あなたのユースケースを正しく理解していれば、ユーザーの入力をトークンに分割し、トークンはグラフの同じパスにあるノードに一致する必要があります。あなたの説明では子ノードが親を指していますが、グラフの "下"のラベル、基本的に葉ノードを探したいとします。私はこれをa:子関係から親ノードへの親関係と仮定します。

あなたが望むことができるクエリは次のとおりです。トークンのリストをパラメータ{tokens}として渡すと仮定します。パラメータの使用については、開発者のドキュメントを参照してください。

UNWIND {tokens} as token 
MATCH (n) 
WHERE labels(n) = token 
AND NOT()-[:Parent]->(n) 
RETURN n 

これにより、返されるノード自体が他のノードの親でないことが保証されます。

しかし、他のノードの親であってもノードを返すようにしたい場合は、代わりにルートノードから最も遠いノードを返すことができます。これには次のものが必要です:グラフ全体のルートにあるルートノード。あなたの説明の例では、ルートは:動物の親になります。

UNWIND {tokens} as token 
MATCH (n) 
WHERE labels(n) = token 
MATCH (n)-[r:Parent*]->(:Root) 
RETURN n 
ORDER BY SIZE(r) 
LIMIT 1 

ルートと同じ距離に複数のノードがある場合、このクエリは動作するとは限りません。例えば、 "germanShepard"と "labra"がトークンリストの要素として与えられた場合、返されるノードが保証されていないLIMIT 1のため、対応するノードのうちの1つだけが返されます。

+0

ありがとうございました。 –

関連する問題