web-dev-qa-db-ja.com

neo4jは、一致するプロパティを持つすべてのノードを検索します

ノードのセットが比較的多く、プロパティ値が一致するノードのペアをすべて見つけたいのですが、プロパティ値が何であるかを事前に知らないか、気にしません。これは基本的に重複ノードを見つける試みですが、重複の定義を同じプロパティ値を持つ2つ以上のノードに制限することができます。

どのように進めるかについてのアイデアはありますか? neo4jドキュメントで開始点が見つかりません。 1.8.2コミュニティエディションを使用しています。

[〜#〜]編集[〜#〜]
最初の質問で明確になっていないことをお詫びしますが、私は暗号を介してこれを行うことについて話している。

15
Paul

プロパティの値をカウントし、ノードのコレクションも返すサイファー:

_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;
_
21
Eve Freeman

あなたは私があなたがやりたいことを何でもするだろうと思うこの人を試すことができます。

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つのペアのみが必要です。パフォーマンスについてはよくわかりません。テストしてください。

2
p3rnilla

次のアプローチはどうですか?

  • getAllNodes を使用して、すべてのノードでIterableを取得します。
  • getPropertyKeys および getProperty(key) を使用して、ノードのすべてのプロパティを含む_Java.util.Map_を構築します。マップのhashCode()を計算します
  • hashCodeをキーとして使用し、node.getId()のセットを値として使用して、グローバルMapを構築します。

これにより、重複する候補が得られるはずです。 hashCode()セマンティクスに注意してください。同じhashCodeにマッピングする異なるプロパティを持つノードが存在する可能性があります。

2

Neo4j 3.3.4を使用すると、次のことが簡単にできます。

MATCH (n) where EXISTS(n.propertyName) return n

propertyNameを探しているプロパティに変更するだけです。

1
jediwompa

Neo4j 3.1.1

HASはCypherでサポートされなくなりました。代わりに、EXISTSを使用してください。

特定のプロパティを持つノードを検索する場合、Cyperは次のとおりです。

MATCH (n:NodeLabel) where has(n.NodeProperty) return n
1
KAIQI YUAN

そのプロパティにインデックスを使用することもできます。次に、指定された値について、すべてのノードを取得します。利点は、値の概算を照会することもできることです。

0
RaduK

最良/最も簡単なオプションは、ローカルの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);
    }
}

これにより、リストが出力されます。これらのノードを削除するなど、さらに多くのことを行う必要がある場合は、他のノードで何かを行うことができます。

物件名をご存知ですか?これは複数のプロパティですか、それとも単一の名前と値のペアの単なる複製ですか?複数のプロパティを実行している場合は、所有しているプロパティごとにマップを作成するだけです。

0
Nicholas