2013-05-29 20 views
12

私は比較的大きなノードのセットを持っていますが、プロパティの値が一致するすべてのノードのペアを見つけたいと思います。これは基本的には重複ノードを見つける試みですが、同じプロパティ値を持つ2つ以上のノードに重複の定義を限定することができます。neo4j一致するプロパティを持つすべてのノードを見つけよう

どのように進めるのですか? neo4jドキュメントの開始点が見つかりません。私は1.8.2コミュニティ版です。最初の質問で明らかにされて、私はサイファーを介してこれをやっについて話していないため申し訳ありません

EDIT

答えて

0

ローカルの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); 
    } 
} 

これはリストを出力します。これらのノードを削除するような、もっとやりたいことがあれば、elseで何かできます。

あなたはプロパティの名前を知っていますか?これは複数のプロパティか、単一の名前/値ペアの重複だけですか?複数のプロパティを実行している場合、各プロパティのマップを作成するだけです。

次のアプローチについてどう
+0

私は、プロパティ名を知っていますが、私は/ B、可能であればCYPHERを介してこれをやろうとしていますc Javaクライアントを使用していないので、私の消費するアプリケーションは、REST APIとCypherのクエリを使用してサーバーと通信しています。 – Paul

+0

問題は、プロパティ名にこれらのノードをインデックス付けしない限り、ループを使用する必要があることです。インデックスを作成している場合は、各ノードをループして、特定のプロパティに対して1つ以上のノードが返された場合はインデックスを調べることができます。 – Nicholas

2

  • すべてのノードを返すイテレータを取得するためにgetAllNodesを使用しています。
  • getPropertyKeysおよびgetProperty(key)を使用すると、ノードのすべてのプロパティを含むjava.util.Mapが構築されます。これはあなたに重複しているの候補を与える必要があり

値としてマップのhashCode()

  • がキーとnode.getId()のセットとしてハッシュコードを使用してグローバルMapを構築計算します。 hashCode()セマンティクスに注意してください。同じハッシュコードに異なるプロパティマッピングを持つノードが存在する可能性があります。

  • +3

    上記のようにjavaを使用していません。また、私は20,000以上のノードを持っています。ループよりも効率的なものを望んでいました。 – Paul

    0

    また、そのプロパティのインデックスを使用することもできます。与えられた値に対して、すべてのノードを取得します。利点は、値の近似を照会することもできることです。

    +0

    これはどのように使用しますか? – Automatico

    2

    あなたがしたいと思うものは誰でもやってみてください。

    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は両方のノードで等しくなるはずです.2つの可能性のうちの1対だけがid比較によって取得されます。パフォーマンスについてはわからない - テストしてください。

    +0

    が有望に見える、私はそれを試してみましょう、ありがとう。 – Paul

    19

    サイファーだけでなくノードのコレクションを返して、プロパティの値をカウントする:コンソール上

    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; 
    
    +0

    Neo4j 2.0.0-M06では、マッチパターンの周りに()が必要であることを伝える構文エラーが発生します。 Like:match(n:ラベル) – holaSenor

    +0

    ええ、M06の要件です。ありがとう。私は更新します。 –

    0

    のNeo4j 3.1.1

    はもはやサイファーでサポートされていないしており、使用してください代わりに存在しています。

    あなたが特定のプロパティを持つノードを検索したい場合は、次のように、Cyperは次のとおりです。

    MATCH (n:NodeLabel) where has(n.NodeProperty) return n 
    
    関連する問題