簡體   English   中英

由每個節點限制,而不是整個查詢

[英]Limit by each node, rather than whole query

我有大量的用戶和照片,它們之間有三種可能的關系(可能會在以后添加更多)。 這些關系POSTED_BYAPPEARS_INMENTIONED_IN 給定一個特定的用戶,我想要一個查詢,它返回他們的網絡n跳。 例如,這應該包括他們發布的照片​​,他們出現或被提及的照片,以及發布這些照片的帳戶。

我目前的詢問是:

MATCH (root:account { username: {username} })-[r*1..4]-(u)
RETURN *
LIMIT 50

這個問題是限制是基於總行完成的。 這導致在具有大量子節點時僅返回一個1級節點。 這是對問題的更直觀的解釋。

這是普通用戶可能看到的(簡化):

在此輸入圖像描述

如果找到的第一個節點有很多照片,則會返回以下內容:

在此輸入圖像描述

由於用戶擁有大量媒體,因此無需顯示其網絡的准確表示即可達到極限。 相反,我希望我的查詢將每個節點限制為最多n個子節點。

從我在這里讀到的幾個答案來看,它看起來應該可以用COLLECT ,但是我找不到任何例子。

您可以通過限制路徑長度來使用cypher執行此操作:

MATCH path=(root:account { username: {username} })-[r*1..4]-(u)
WITH COLLECT(path) as paths
RETURN filter(x in paths WHERE length(x)<50)

您可以在使用Neo4j Traversal API時執行此操作。 在求值程序中,您可以檢查路徑的長度,並在路徑超過所需長度時進行修剪。

import org.neo4j.graphdb.Direction;
import org.neo4j.graphdb.Path;
import org.neo4j.graphdb.traversal.Evaluation;
import org.neo4j.graphdb.traversal.Evaluator;

public class MyEvaluator implements Evaluator{

    @Override
    public Evaluation evaluate(Path path) {
        if(path.length()>=50)
        {           
            return Evaluation.INCLUDE_AND_PRUNE;
        }

        return Evaluation.INCLUDE_AND_CONTINUE;
    }
}

我認為您需要以下內容:

 MATCH (root:account { username: {username} })-[]-> (child1)-[r*1..4]-(u)
 RETURN child1, collect(u)
 LIMIT 50

這將返回最多50行,每行將有兩列。 第一列是child1s,第二列是這個孩子的'Us'

您可以手動構建此查詢:

MATCH (root:account { username: {username} }) 
WITH {ids: [root], rels: []} as graph

UNWIND graph.ids as N  
  MATCH (N)-[r]->(C) WHERE NOT C IN graph.ids
  WITH graph, C, r LIMIT 50
  WITH graph, collect(C) as ids, collect(r) as rels
  WITH {ids: ids + graph.ids, rels: graph.rels + rels} as graph

UNWIND graph.ids as N  
  MATCH (N)-[r]->(C) WHERE NOT C IN graph.ids
  WITH graph, C, r LIMIT 50
  WITH graph, collect(C) as ids, collect(r) as rels
  WITH {ids: ids + graph.ids, rels: graph.rels + rels} as graph

UNWIND graph.ids as N  
  MATCH (N)-[r]->(C) WHERE NOT C IN graph.ids
  WITH graph, C, r LIMIT 50
  WITH graph, collect(C) as ids, collect(r) as rels
  WITH {ids: ids + graph.ids, rels: graph.rels + rels} as graph

UNWIND graph.ids as N  
  MATCH (N)-[r]->(C) WHERE NOT C IN graph.ids
  WITH graph, C, r LIMIT 50
  WITH graph, collect(C) as ids, collect(r) as rels
  WITH {ids: ids + graph.ids, rels: graph.rels + rels} as graph

RETURN graph.rels

當然,在大跳轉的情況下,可以通過javascript使用簡單的連接來收集此結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM