在Neo4j中生成与机会百分比的关系

时间:2018-03-25 10:35:56

标签: python database csv neo4j probability

考虑一个包含超过1.300.000行的CSV文件,其中包含有关arXiv文章的信息。该文件的结构如下所示:

id,title,url,abstract,date,categories,authors
0,"Title1",http://arxiv.org/abs/0704.0001,"Blabla",2007-04-02,Phenomenology,"Balázs, C.;Berger, E. L.;Nadolsky, P. M."

我将它导入Neo4j数据库。这不是问题。但是,我想创建一些伪随机(可能基于一些组成概率模型)的文章之间的关系 - 引用。

我想生成(第1条) - [:CITES] - >(第2条)关系。但我希望他们不要完全随机。我想要考虑的是,文章只能引用比自己更旧的文章,如果文章属于同一类别,那么引用另一篇文章的机会要高得多,同样的作者也会提高引用的机会。试着模仿现实世界。

我的问题是 - 如何处理?可以用Cypher完成吗?或者我应该创建(即python)应用程序,我应该如何构建它?或者我可能应该在CSV中创建它们作为列,然后将其导入Neo4j,如下所示:

id,title,url,abstract,date,categories,authors,cites
100,"Test",http://test.test,"Desc",2018-03-25,Phenomenology,"XYZ, John","0;4;15;25;60;69;89"

或许有一种工具可以帮助我?或者我错过了什么?创建这些关系的最佳方式(也许是最简单的方法)是什么?

1 个答案:

答案 0 :(得分:0)

您可以创建一个cypher脚本来执行此操作。 对于每篇文章,您必须创建一个随机评分函数来查找最佳的其他城市。

结果应该是这样的:

MATCH (a:Article) WHERE size((a)-[:CITES]->(:Article)) = 0
WITH a LIMIT 100
  MATCH (b:Article) WHERE b.date < a.date 
 WITH 
  a, 
  b,
  CASE 
    WHEN a.categories = b.categories THEN rand()
    ELSE 0
  END AS catScore,
  CASE 
    WHEN a.authors = b.authors THEN rand()
    ELSE 0
  END AS catAuthor
  WITH a, b, catScore + 2* catAuthor AS score ORDER BY score DESC LIMIT 1
    CREATE (a)-[:CITES]->(b)
    RETURN count(*)

您应该多次执行此查询,直到其结果等于 0 。 (如果需要,在 APOC 中有程序fot。)

此查询不适用于您的数据模型,因为日期是字符串。我建议您存储时间戳,而不是字符串日期(还有 APOC 函数来解析日期),并在其上创建索引。

此外,我认为您的数据模型中有AuthorCategory个节点,不是吗?所以你应该调整查询。