Database Neo4j查询多跳

Database Neo4j查询多跳,database,neo4j,cypher,graph-databases,Database,Neo4j,Cypher,Graph Databases,大家好,我正在尝试编写一个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

大家好,我正在尝试编写一个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
结果是一样的,我认为它们不应该是一样的-任何帮助都将不胜感激

下面是一个不需要事先知道你最有效率的作者共写了多少篇论文的查询。它自动确定作者是谁,然后查找他/她的所有合著者及其合著者。为了实现这一点,-[:writed*.3]模式是无方向的,并且使用了3的上限,因为要到达共同作者的共同作者,将有3个关系的跃点。通常,如果希望合著者的深度为N,则需要上界为1+N-1*2

此外,如果您想在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
RANGE1,SIZEns-1,2返回每个路径中纸张节点的索引列表,因为它们具有奇数索引


请确保禁用浏览器设置中的“连接结果节点”选项,否则可视化可能会显示结果中没有的额外节点。

I假设一篇论文可以有多个作者,对吗?是的,论文可以有多个作者您对[:write*1..2]的理解是什么?因为您正在使用[:writed*1]没有必要使用*1我感觉你可能误解了某些东西我认为*1会返回所有与作者x合作的人,*1..2会返回所有与作者x合作的人和与作者y合作的人,所以离我的作者x有2跳?sam这让我了解了所有与作者x合作的人author1如果我想跳两下怎么办?也是的,这个结果和我的一样,当我移动到2跳之外需要帮助的地方。也就是说,我也希望所有与我最初的一组合著者是合著者的人。哦,好吧,我的困惑是,我认为n-1实际上是为了找到作者。我不知道*1..2不能让我找到真正的合著者。非常感谢你,现在这样做更有意义了!嘿,山姆,如果你不介意的话,再问一个问题,因为我很好奇。因为这只返回行数据,所以我希望看到可视化。我现在通过返回auth1,auth2,将auth1和auth2之间的纸张定义为p,来显示部分内容,所以我返回它。我得到了大多数联系,但我不知道如何让这些论文摆脱这种局面。关于你的下一个最后一个评论:另外,可变长度路径需要是无方向的,并且需要为auth2指定作者标签,以防止收回论文。请参阅我的更新答案,以获取一个查询,该查询应允许您可视化合著者和合著论文。
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