ノードのセットが比較的多く、プロパティ値が一致するノードのペアをすべて見つけたいのですが、プロパティ値が何であるかを事前に知らないか、気にしません。これは基本的に重複ノードを見つける試みですが、重複の定義を同じプロパティ値を持つ2つ以上のノードに制限することができます。
どのように進めるかについてのアイデアはありますか? neo4jドキュメントで開始点が見つかりません。 1.8.2コミュニティエディションを使用しています。
[〜#〜]編集[〜#〜]
最初の質問で明確になっていないことをお詫びしますが、私は暗号を介してこれを行うことについて話している。
プロパティの値をカウントし、ノードのコレクションも返すサイファー:
_start n=node(*)
where has(n.prop)
with n.prop as prop, collect(n) as nodelist, count(*) as count
where count > 1
return prop, nodelist, count;
_
コンソールの例: http://console.neo4j.org/r/k2s7aa
このようなプロパティを使用してインデックススキャンを実行することもできます(このプロパティを持たないノードを見ないようにするため)。start n=node:node_auto_index('prop:*') ...
2.0ラベル付き暗号ラベル:
_match (n:Label)
with n.prop as prop, collect(n) as nodelist, count(*) as count
where count > 1
return prop, nodelist, count;
_
あなたは私があなたがやりたいことを何でもするだろうと思うこの人を試すことができます。
START n=node(*), m=node(*)
WHERE
HAS(n.name) AND HAS (m.name) AND
n.name=m.name AND
ID(n) <ID(m)
RETURN n, m
http://console.neo4j.org/?id=xe6wmt
両方のノードにname
プロパティが必要です。 name
は両方のノードで等しくなければならず、id比較によって取得した2つの可能性の1つのペアのみが必要です。パフォーマンスについてはよくわかりません。テストしてください。
次のアプローチはどうですか?
Java.util.Map
_を構築します。マップのhashCode()
を計算しますnode.getId()
のセットを値として使用して、グローバルMap
を構築します。これにより、重複する候補が得られるはずです。 hashCode()セマンティクスに注意してください。同じhashCodeにマッピングする異なるプロパティを持つノードが存在する可能性があります。
Neo4j 3.3.4を使用すると、次のことが簡単にできます。
MATCH (n) where EXISTS(n.propertyName) return n
propertyName
を探しているプロパティに変更するだけです。
Neo4j 3.1.1
HASはCypherでサポートされなくなりました。代わりに、EXISTSを使用してください。
特定のプロパティを持つノードを検索する場合、Cyperは次のとおりです。
MATCH (n:NodeLabel) where has(n.NodeProperty) return n
そのプロパティにインデックスを使用することもできます。次に、指定された値について、すべてのノードを取得します。利点は、値の概算を照会することもできることです。
最良/最も簡単なオプションは、ローカルのMap
のようなことをすることです。このようなことをした場合、次のようなコードを作成できます。
GlobalGraphOperations ggo = GlobalGraphOperations.at(db);
Map<Object, Node> duplicateMap = new HashMap<Object, Node>();
for (Node node : ggo.getAllNodes()) {
Object propertyValue = node.getProperty("property");
Node existingNode = duplicateMap.get(propertyValue);
if (existingNode == null) {
duplicateMap.put(propertyValue, node);
} else {
System.out.println("Duplicate Node. First Node: " + existingNode + ", Second Node: " + node);
}
}
これにより、リストが出力されます。これらのノードを削除するなど、さらに多くのことを行う必要がある場合は、他のノードで何かを行うことができます。
物件名をご存知ですか?これは複数のプロパティですか、それとも単一の名前と値のペアの単なる複製ですか?複数のプロパティを実行している場合は、所有しているプロパティごとにマップを作成するだけです。