Neo4JはIDでノードを取得します


84

プロジェクトの1つにneo4jを使用していますが、プロパティが1つしかないノードがありname、IDを使用してそのノードを取得したいのですが、すでにIDがありますが、このコードを使用すると

MATCH (s:SKILLS{ID:65110}) return s

それは何も返しません、ここに私のノードがあります

ここに画像の説明を入力してください

クエリが間違っている場合は、番号を使用してクエリを実行するにはどうすればよいですか


どのグラフ視覚化ツールを使用していますか?ありがとう。yworks.com/neo4j-explorerのカスタマイズに適したオプションを知っています。
MyUserInStackOverflow

回答:


136
MATCH (s)
WHERE ID(s) = 65110
RETURN s

このID関数は、ノードまたは関係のIDを取得します。これは、呼び出された、idまたはID作成したプロパティとは異なります。


1
(s:SomeLabel {id:65110})のようなデータを取得する別の方法はありますか?
ドンキーコング2015年

@DonkeyKongいいえ、idプロパティを追加することもできます。これはid以外のものです。idプロパティは任意のタイプにすることができますが、ノードまたはエッジIDは符号なし整数であり、Neo4Jの内部構造内の場所にリンクされています。
pvoosten 2015

25
標準の免責事項:長期的なエンティティの識別に内部Neo4jIDを使用しないでください。Neo4jの将来のバージョンでは、パフォーマンスの目的でこれらのIDをシフトする可能性があります。CONSTRAINTエンティティを追跡するための独自の一意のIDプロパティ(理想的にはを使用)を作成します
Brian Underwood

誰かが興味のある方は公式サイファーのドキュメントの段落を追加:neo4j.com/docs/cypher-manual/current/clauses/match/...
Ziemowit Stolarczyk

13

警告:次の答えは正しくありません!STARTは、レガシーインデックスにアクセスする場合にのみ使用する必要がありますCypher2.2以降では無効になっています。

Neo4jは、の使用を推奨しWHERE ID(n) = 、さらに1回のルックアップのみが必要であると述べています(一致するIDを見つけるためにすべてのノードをスキャンするわけではありません)

誰かが同じ過ちを犯さないように、この答えを維持します。

あなたはできる使いWHERE ID(s) = 65110ますが、これは、データベース内のすべてのノードのIDをチェックします。

これを行うためのより効率的な方法があります:

START s=NODE(517) MATCH(s) RETURN s

単純なクエリのEXPLAINとPROFILEの結果は、@ Codeが正しいことを示しています。なぜこれがドキュメントにないのですか?
ソナタ

@Sonataどのバージョンを実行していますか?Neo4jの新しいバージョンでは、STARTが廃止されるはずです。
コーディング2016

3.0.7。Result Detailsコンソールでこれらの例を見てください:console.neo4j.org/r/dbz1we(AllNodesScanを実行)およびconsole.neo4j.org/r/9076wd(NodeByIdを実行)
Sonata

@Sonataなぜこれが起こっているのかわかりません。まず第一に、それは機能しないはずです-ドキュメントは、STARTがCypher 2.0で非推奨になり、Cypher 2.2で無効になっていると述べていますが、明らかにまだ機能しています。第二に、IDを持つMATCHは+NodeByIdSeek1つのノードにのみアクセスする必要がありますが、何らかの理由で+AllNodesScan。を実行しています。
コーディング2016

4

あなたは言うことができます:

(n:User) where id(n) >=20 RETURN n

これにより、ノード参照IDが20を超えるUserタイプのすべてのノードが返されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.