0

要件: 2 つ以上の関連する一致するノードを見つけて、それらをグループとして表示し、可能な一致の組み合わせをすべて繰り返すことはありません。

データ構造:

E1 はエンティティ 1 N1 はエンティティ 1 の名前 P1 はエンティティ 1 の電話番号

E2 はエンティティ 2 N2 はエンティティ 2 の名前 P2 はエンティティ 2 の電話番号

E3 はエンティティ 3 です N3 はエンティティ 3 の名前です P3 はエンティティ 3 の電話番号です

使用したクエリ:

    start e1=node:entities('entityID:90754 OR entityID:113184 OR entityID:29472')
    match (n1)<-[:HAS_NAME]-(e1)-[:HAS_PHONE]-(p1), (p1)-[m:MATCHES_TO]-(p2), (p2)-[:HAS_PHONE]-        (e2)-[:HAS_NAME]-(n2), (n1)-[nm:MATCHES_TO]-(n2) 
    return e1, n1, p1, collect(e2), collect(n2), collect(p2);

クエリの出力

# | e1 | n1 | p1 | 収集 (e2) | 収集 (n2) | 収集(p2)

行 1 | エンティティ1 | entity1 の名前 | entity1 の電話番号 | entity2 の電話、entity3 の電話 | entity2 の名前、entity3 の名前 | entity2 の電話、entity3 の電話

行 2 | エンティティ 2 | entity2 の名前 | entity2 の電話 | entity1 の電話番号 | entity1 の名前 | entity1 の電話

行 3 | エンティティ3 | entity3 の名前 | entity3 の電話 | entity1 の電話番号 | entity1 の名前 | entity1 の電話

問題: 結果セットの最初の行だけで十分です。行 2 と行 3 は、最初の行のコレクションの一部であるため、必須ではありません。

上記の例で行のみを取得するように暗号クエリを作成する方法を教えてください

4

1 に答える 1

0

最初にヘッド エンティティ名 (e1.name) で結果を並べ替え、名前がヘッド エンティティ名 (e1.name) より小さい関連エンティティ (e2) を除外できます。現在の行の前に行 X があり、e1 はその行 X の関連エンティティとして表示される必要があります。つまり、ペア (e2, e1) は前の行に既に表示されています。

次に、以下のクエリに示すように、関連するエンティティが残っていない行のみを除外する必要があります。

Match (p1:EntityPhone)<-[:HasPhone]-(e1:Entity)-[:HasName]->(n1:EntityName), (p2:EntityPhone)<-[:HasPhone]-(e2:Entity)-[:HasName]->(n2:EntityName), (n1)-[:Matches]-(n2), (p1)-[:Matches]-(p2)
With e1.name as ename, filter(x in collect(e2.name): x > e1.name) as e2names
Order by ename
With ename, e2names, reduce(e2count = 0 , n in e2names : e2count + 1) as e2count
Where e2count > 0
Return ename, e2names

このクエリの Web コンソールは次のとおりです。http://console.neo4j.org/?id=ljfbpb

于 2013-08-29T15:21:26.163 に答える