1

私はNeo4jが初めてで、次のような状況にあります

ここに画像の説明を入力

上の図では、ラベル を持つノードと、ラベルuserを持つサブノードを表していますshops。これらの各サブノードには、ラベルが付いたサブノードがありitemsます。図に示すように、各ノードitemsには属性があり、項目ノードは各ノードの属性sizeによって降順になっています。sizeshops

質問

each からitems以下のサイズの2 つのノードを取得したい。どうやってするか?試してみましたが、必要な方法で機能していません17shops

これが私が試したことです

match (a:user{id:20000})-[:follows]-(b:shops)
with b
match (b)-[:next*]->(c:items)
where c.size<=17
return b
limit 2

注 -これらのshopsノードには、数千のitemsノードを含めることができます。では、何千ものノードすべてをトラバースせずに目的のノードを見つける方法items。助けてください、事前に感謝します。

4

2 に答える 2

3

現在、Cypher はこのケースを十分に処理していません。おそらく、これには Java ベースのアンマネージ拡張を行うでしょう。

次のようになります。

public List<Node> findItems(Node shop, int size, int count) {
   List<Node> results=new ArrayList<>(count);
   Node item = shop.getSingleRelationship(OUTGOING, "next").getEndNode();
   while (item.getProperty("size") > size && results.size() < count) {
       if (item.getProperty("size") <= size) result.add(item);
       item = item.getSingleRelationship(OUTGOING, "next").getEndNode();
   }
   return result;
}


List<Node> results=new ArrayList<>(count*10);
for (Relationship rel = user.getRelationships(OUTGOING,"follows")) {
   Node shop = rel.getEndNode();
   results.addAll(findItems(shop,size,count));
}
于 2014-03-10T00:25:59.247 に答える
0

サイズに応じてグループ化することで、各ショップのすべてのアイテムをトラバースする必要がなくなります。このアプローチでは、グラフは次のようになります

(:User)-[:follows]-(:Shop)-[:sells]-(:Category {size: 17})-[:next]-(:Item)

次に、次を使用してショップごとに 2 つのアイテムを見つけることができます。

match (a:User {id: 20000})-[:follows]-(s:Shop)-[:sells]-(c:Category)
where c.size <= 17
with *
match p = (c)-[:next*0..2]-()
with s, collect(tail(nodes(p))) AS allCatItems
return s, reduce(shopItems=allCatItems[..0], catItems in allCatItems | shopItems + catItems)[..2]

shopItems=allCatItems[..0]型チェックの問題の回避策です。これは基本的に、shopItems をノードの空の Collection に初期化します。

于 2014-03-13T21:11:40.920 に答える