使用neo4j

时间:2018-07-13 15:24:55

标签: neo4j cypher

我已经将带有参考出版物的DBLP数据库从Crossref API导入了neo4j。

目标是为数据库中的每个作者计算一个自引用商。 我想计算该商的方式如下:

  1. 找到已撰写出版物引用同一作者另一出版物的作者
  2. 对于这些出版物中的每一个,都计算同一作者撰写的参考出版物
  3. 将自我推荐的数量除以所有推荐的数量
  4. 将此数字设置为发布的参数scq(自引用商)
  5. scq的所有值相加,然后除以作者撰写的出版物总数
  6. 将此值设置为作者的属性scq

作为示例,我为作者“ Danielle S. Bassett”提供了以下子图:

enter image description here

从该图可以看到她有2个包含自我参考的出版物。 用言语: 丹妮尔(Danielle)写了出版物1,2,3,4 出版物1参考出版物2 出版物3参考出版物4

我的尝试是使用以下密码查询:

match (a:Author{name:"Danielle S. Bassett"})-[:WROTE]->(p1:Publication)-[r:REFERENCES]->(p2:Publication)<-[:WROTE]-(a)
with count(p2) as ssc_per_publ,
     count(p1) as main_publ_count,
     collect(p2) as self_citations,
     collect(p1) as main_publ,
     collect(r) as refs,
     a as author
return author, main_publ, ssc_per_publ, self_citations, main_publ_count, refs

此查询表的结果如下:

enter image description here

从表中可以看到,main_publ_count的计算正确,因为她撰写了2个出版物,其中包含自我参考,但是ssc_per_publ(每个出版物的自我引用计数)是错误的,因为它计算了所有自我参考。但是我需要每次发布的自我参考数量。

计算商数不是问题,但是从neo4j获取正确的值是

我希望我已经清楚地表达了自己,让您理解这个问题。 也许你们当中有人知道解决这个问题的方法。谢谢!

1 个答案:

答案 0 :(得分:2)

您的WITH子句使用author作为唯一的aggregation function“分组键”,因为它是该子句中唯一不使用聚合函数的术语。因此,该子句中的所有聚合函数都只聚合了一个术语。

要获得(由该作者)每个出版物的“自我引用计数”,您必须执行以下操作(为简单起见,该查询将忽略所有其他计数和集合)。 authorpubl共同构成此查询中的“分组关键字”。

MATCH (author:Author{name:"Danielle S. Bassett"})-[:WROTE]->
  (publ:Publication)-[r:REFERENCES]->(p2:Publication)<-[:WROTE]-(a)
RETURN author, publ, COUNT(p2) as self_citation_count;

[此外:您的原始查询也有其他问题。例如,您应该使用COUNT(DISTINCT p1) as main_publ_count,以使对同一p1实例的多次自我引用不会增加“主要”出版物的数量。]