首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >社交网络属性的neo4j百分比

社交网络属性的neo4j百分比
EN

Stack Overflow用户
提问于 2017-11-27 13:55:53
回答 2查看 575关注 0票数 0

如何计算社交网络的所有连接的属性百分比?在这个特定的示例中,我想通过评估用户的交互(call,sms)来计算用户的欺诈性:

代码语言:javascript
复制
CREATE (Alice:Person {id:'a', fraud:1})
CREATE (Bob:Person {id:'b', fraud:0})
CREATE (Charlie:Person {id:'c', fraud:0})
CREATE (David:Person {id:'d', fraud:0})
CREATE (Esther:Person {id:'e', fraud:0})
CREATE (Fanny:Person {id:'f', fraud:0})
CREATE (Gabby:Person {id:'g', fraud:0})
CREATE (Fraudster:Person {id:'h', fraud:1})


CREATE
  (Alice)-[:CALL]->(Bob),
  (Bob)-[:SMS]->(Charlie),
  (Charlie)-[:SMS]->(Bob),
  (Fanny)-[:SMS]->(Charlie),
  (Esther)-[:SMS]->(Fanny),
  (Esther)-[:CALL]->(David),
  (David)-[:CALL]->(Alice),
  (David)-[:SMS]->(Esther),
  (Alice)-[:CALL]->(Esther),
  (Alice)-[:CALL]->(Fanny),
  (Fanny)-[:CALL]->(Fraudster)

当尝试查询时,例如:

代码语言:javascript
复制
MATCH (a)-->(b)
WHERE b.fraud = 1
RETURN (count() / ( MATCH (a) -->(b) RETURN count() ) * 100)

我看到以下错误:

代码语言:javascript
复制
Invalid input '>': expected 0..9, '.', UnsignedHexInteger, UnsignedOctalInteger or UnsignedDecimalInteger (line 3, column 33 (offset: 66))
"RETURN (count() / ( MATCH (a) -->(b) RETURN count() ) * 100)"
                                 ^

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-28 20:59:57

此查询将返回每个欺诈的连接百分比:

代码语言:javascript
复制
MATCH (:Person)-[:CALL|:SMS]->(f:Person)
WITH TOFLOAT(COUNT(*))/100 AS divisor, COLLECT(f) AS fs
UNWIND fs AS f
WITH divisor, f
WHERE f.fraud = 1
RETURN f, COUNT(*)/divisor AS percentage

根据样本数据,结果是:

代码语言:javascript
复制
+----------------------------------------------+
| f                        | percentage        |
+----------------------------------------------+
| Node[13]{id:"h",fraud:1} | 9.090909090909092 |
| Node[6]{id:"a",fraud:1}  | 9.090909090909092 |
+----------------------------------------------+

此查询只需对DB进行一次扫描,并明确说明节点标签和关系类型--以筛选出DB中可能存在的任何其他数据。

票数 1
EN

Stack Overflow用户

发布于 2017-11-27 14:15:34

RETURN部分中,调用一个新的查询:MATCH (a) -->(b) RETURN count()

这在Neo4j中是不允许的,您应该使用WITH关键字进行子查询:

代码语言:javascript
复制
MATCH ()-->() 
WITH count(*) AS total
  MATCH ()-->(b)
  WHERE b.fraud = 1
  RETURN toFloat(count(*)) / total * 100

或者在您的例子中,因为您只需要数据库中关系的总数,所以可以进行以下查询:

代码语言:javascript
复制
MATCH ()-->(b)
WHERE b.fraud = 1
RETURN toFloat(count(*)) / size(()-->()) * 100

更新

  • 在密码查询中添加toFloat,否则分区将给出一个干预器,而不是一个浮点数
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47512635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档