可选节点聚合

时间:2017-08-15 20:11:03

标签: neo4j cypher orientdb arangodb

在图形数据库中,如何计算用户直接或间接为节点“注释”贡献的次数。在下图中,答案是2(1个直接,1个间接)

Diagram

3 个答案:

答案 0 :(得分:1)

根据您的示例图表,在Neo4j中,您可以使用以下Cypher查询来捕获直接(User)-->(Comment)关系和使用variable length path operator的间接(User)-->(Comment)-->(Comment)

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

修改

正如Bruno指出的那样,此查询将为您的示例返回3,因为它会考虑用户分组的注释的所有路径。相反,您可能对连接到每个用户的 distinct Comment节点的数量感兴趣:

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

答案 1 :(得分:0)

正如您标记orientdb一样,以下是Cypher与OrientDB类似的方法之一。

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

您甚至可以将深度应用于搜索

select count(*) from (match {class:User}-->{class:Comment, as:r, while: ($depth<3)} return r)

答案 2 :(得分:0)

AQL graph traversal中的ArangoDB,包含用户的顶点集合nodes评论评论-2 < / em>和带边的边集合contrib,你可以这样做:

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

评论节点上开始遍历,其中可变深度为1到5,跟随入站方向contrib集合中的所有边。应用过滤器以限制遍历以用户结束的路径。

它找到的两个路径是comment <-- usercomment <-- comment-2 <-- user。对于这两个路径,返回一个常量值(我们实际上并不需要任何节点)。周围的RETURN COUNT()语句计算子查询返回的结果数,因此 2

您还可以从评论用户遍历其他方式:

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

在大图上,您可以测试两个查询,看看一个查询是否比另一个更好。另外,请考虑使用bfs uniqueVertices(广度优先搜索)和var number = prompt("Enter a number"); var numberOfDigits = number.length; var sum = 0; for (i = 0; i < numberOfDigits; i++) { sum += Math.pow(number.charAt(i), numberOfDigits); } if (sum == number) { alert("The entered number is an Armstrong number."); } else { alert("The entered number is not an Armstrong number."); }进行查询优化。