2017-08-15 61 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进行查询优化。