【问题标题】:Neo4j query multiple hopsNeo4j 查询多跳
【发布时间】:2018-02-20 18:57:52
【问题描述】:

大家好,我正在尝试编写一个 neo4j 查询来获得多个跃点。

目前我的架构是 作者 - fname,lname & 论文 - 标题

关系:作者 -> 写过 -> 论文

MATCH (a:Author)-[:WROTE]->(p:Paper)
WITH a as auth1, count(p.title) as count1
MATCH (auth1) -[:WROTE *1]->(p2:Paper),
              (auth2)-[:WROTE *1]->(p2)
WHERE count1 > 7
RETURN DISTINCT auth1.fname, auth1.lname, auth2.fname,  auth2.lname

我要做的是找到所有与我的作者相关的人,他们撰写的论文最多 - 首先是 1 跳,然后是 2 跳等。我知道论文最多的作者写了 8 篇,因此我的计数 > 7 ;但是我认为我的查询不正确。每当我改变

:WROTE *1 to :WROTE *1..2

结果与我认为不应该的结果相同 - 任何帮助将不胜感激

【问题讨论】:

  • 我假设一篇论文可以有多个作者,对吗?
  • 是的,论文可以有多个作者
  • 你对[:WROTE*1..2]在做什么有什么理解?由于您使用的是 [:WROTE*1] (没有必要使用 *1),我感觉您可能误解了一些东西
  • inverse 我认为 *1 将返回所有共同作者,*1..2 将返回所有与作者 x 的共同作者(y)以及所有共同作者-author with (y) so 2 hops away from my author x?

标签: database neo4j cypher graph-databases


【解决方案1】:

[编辑]

下面是一个查询,不需要事先知道您最有成效的作者(共同)撰写了多少篇论文。它会自动确定该作者是谁,然后找到他/她的所有合著者及其合著者。为此,-[:WROTE*..3]- 模式是无方向的,并使用上限 3(因为要到达共同作者的共同作者,需要跳 3 次关系)。一般来说,如果您希望共同作者的深度为 N,则需要上限为 (1+(N-1)*2)

MATCH (auth1:Author)-[:WROTE]->(p:Paper)
WITH auth1, COUNT(p) AS count1
ORDER BY count1 DESC LIMIT 1
MATCH (auth1)-[:WROTE]->(:Paper)-[:WROTE*..3]-(auth2:Author)
RETURN DISTINCT auth1.fname, auth1.lname, auth2.fname,  auth2.lname;

此外,如果您想在 neo4j 浏览器中可视化所有感兴趣的共同作者及其共同撰写的论文,这应该可行:

MATCH (auth1:Author)-[:WROTE]->(p:Paper)
WITH auth1, COUNT(p) AS count1
ORDER BY count1 DESC LIMIT 1
MATCH path=(auth1)-[:WROTE]->(:Paper)-[:WROTE*..3]-(auth2:Author)
WITH auth1, auth2, NODES(path) AS ns
RETURN DISTINCT auth1, auth2, [i IN RANGE(1, SIZE(ns)-1, 2) | ns[i]] AS papers

RANGE(1, SIZE(ns)-1, 2) 返回每​​个pathPaper 节点的索引列表(因为它们具有奇数索引)。

确保禁用Browser Settings 中的Connect result nodes 选项,否则可视化可能会显示结果中没有的额外节点。

【讨论】:

  • sam 这让我每个与 author1 合着的人都知道如果我想要 2 跳怎么办?同样,是的,这个结果与我的结果相同,当我搬到需要帮助的 2 跳远的地方时。这意味着我还希望所有与我最初的合著者合着的人。
  • ohhhhh 好吧,我的困惑是我认为 n-1 真的可以接触到作者。我没有意识到 *1..2 不会让我找到共同作者的实际共同作者。非常感谢,现在这更有意义了!
  • 嘿,如果您不介意附加这个答案,我会问另一个问题,因为我很好奇。由于这仅返回我想查看可视化的行数据。我目前通过返回 auth1、auth2 向我展示了其中的一部分,并且我将 auth1 和 auth2 之间的文件定义为 p,所以我将其返回。我得到了大多数联系,但我没有得到共同作者和他们的共同作者之间的论文,知道如何让这些论文脱离这个问题吗?
  • 关于您的倒数第二条评论:此外,可变长度路径需要是非定向的,并且需要为auth2 指定Author 标签以防止返回Papers.
  • 查看我的更新答案以获取应该让您可视化共同作者和共同撰写的论文的查询。
猜你喜欢
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多