[英]Limit by each node, rather than whole query
我有大量的用戶和照片,它們之間有三種可能的關系(可能會在以后添加更多)。 這些關系POSTED_BY
, APPEARS_IN
和MENTIONED_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.