neo4j 如何返回每个节点的传入和传出关系的数量

u3r8eeie  于 2024-01-07  发布在  其他
关注(0)|答案(4)|浏览(122)

我希望计算每个节点的传入关系数和传出关系数(这可以提供一些wrt连通性的信息)。
我可以使用如下查询获得传入(或传出)的数量:

  1. MATCH outg=(a)-->(b)
  2. RETURN a.name, labels(a) AS Stereotype,count(rels(outg)) AS out
  3. ORDER BY out DESC

字符串
很好。
但是,如果我尝试添加传入关系:

  1. MATCH outg=(a)-->(b), incom=(c)-->(a)
  2. RETURN a.name, labels(a) AS Stereotype,count(rels(outg)) AS out, count(rels(incom)) AS in
  3. ORDER BY out DESC


那么它就不会产生我所期望的结果。在这种情况下,传入和传出的计数都是相同的,而且比它们本身的计数都高得多(所以某种乘法在进行)。
第二种情况下的逻辑有什么问题?

ifsvaxew

ifsvaxew1#

我投了妮可和萨姆的票。
但我认为还有更简单的:

  1. MATCH (a)
  2. RETURN id(a), labels(a) as stereotype,
  3. size((a)-->()) as out, size((a)<--()) as in

字符串
你可以用你想要的任何属性来改变id(a)

更新NEO4J 5

  1. MATCH (a)
  2. RETURN
  3. COUNT { (a)-->() } AS out,
  4. COUNT { (a)<--() } AS in

展开查看全部
zzwlnbp8

zzwlnbp82#

我会这样做。假设你已经加载了电影数据集:

  1. MATCH (a)-[r]-(b)
  2. RETURN COALESCE(a.name, a.title), LABELS(a) AS Label,
  3. SUM(CASE WHEN STARTNODE(r) = a THEN 1 ELSE 0 END) AS outgoing,
  4. SUM(CASE WHEN STARTNODE(r) = b THEN 1 ELSE 0 END) AS incoming
  5. ORDER BY outgoing DESC

字符串
你可以在这里看到它的结果:http://console.neo4j.org/r/6ebvy8

i2loujxw

i2loujxw3#

这个查询应该对你有用。逻辑非常简单。

  1. MATCH (a)
  2. OPTIONAL MATCH (a)-->(b)
  3. WITH a, LENGTH(COLLECT(b)) AS out
  4. OPTIONAL MATCH (c)-->(a)
  5. RETURN a.name, labels(a) AS Stereotype, out, LENGTH(COLLECT(c)) AS in
  6. ORDER BY out DESC;

字符串
Here is a console,用于演示查询。
查询不能正常工作的原因之一是它使用了COUNT()函数,该函数返回行数,而不是集合的长度(或大小)。

ibps3vxo

ibps3vxo4#

  1. MATCH outg=(a)-[og]->(b), incom=(c)-[ic]->(a) RETURN id(a), labels(a) AS Stereotype,count(og) AS out, count(ic) AS in ORDER BY out DESC

字符串

相关问题