答案 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 <-- user
和comment <-- 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.");
}
进行查询优化。