2017-08-15 58 views
3

在圖形db中,如何計算用戶直接或間接對節點「評論」貢獻的次數。在下圖中,答案是2(1直接,1間接)可選節點聚合

Diagram

+0

圖中的邊緣/關係類型是什麼? – InverseFalcon

回答

1

鑑於你的示例圖,在Neo4j的,你可以使用下面的Cypher查詢捕獲直接(User)-->(Comment)關係,並採用間接(User)-->(Comment)-->(Comment)variable length path operator

MATCH (u:User)-[*]->(:Comment) 
RETURN u, COUNT(*) AS num 

編輯

布魯諾指出該查詢喲返回3因爲它考慮了用戶分組的所有路徑。取而代之的是,你在連接到每個用戶不同 Comment節點數量可能感興趣的:

MATCH (u:User)-[*]->(c:Comment) RETURN u, COUNT(DISTINCT c) AS num

+2

該查詢返回3,因爲它會考慮與圖中用戶有關的任何評論。返回2時,你需要指定'MATCH(u:User) - [*] - >(:Comment {text:'comment'})應該考慮什麼評論「 RETURN u,COUNT(*)AS num'或引用評論的任何其他標識符。 –

+0

謝謝你們,非常感謝! –

0

正如您所標記orientdb,下面是類似的Cypher與OrientDB的途徑之一。

select count(*) from (match {class:User}-->{class:Comment, as:r} return r) 

可以深度甚至應用到搜索

0

隨着AQL graph traversalArangoDB,含用戶評論評論-2和邊緣集合的頂點集合nodescontrib與邊緣,你可以這樣做:

RETURN COUNT(
    FOR v IN 1..5 INBOUND "nodes/comment" contrib 
     FILTER v._key == "user" 
     RETURN 1 
) 

沿入站方向在contrib集合中的所有邊沿之後,遍歷開始於註釋節點,深度從1到5不等。應用過濾器將遍歷限制爲以用戶結束的路徑。

找到的兩條路徑是comment <-- usercomment <-- comment-2 <-- user。對於這兩條路徑,返回一個常量值(我們實際上並不需要節點中的任何東西)。周圍的RETURN COUNT()語句計算子查詢返回的結果數量,因此。

你也可以遍歷其他方式,從評論用戶

RETURN COUNT(
    FOR v IN 1..5 OUTBOUND "nodes/user" contrib 
     FILTER v._key == "comment" 
     RETURN 1 
) 

在一個大圖,你可以測試兩個查詢,看是否執行一個比另一個更好。還考慮使用traversal options,如bfs(廣度優先搜索)和uniqueVertices進行查詢優化。