Neo4j查询多个跃点

时间:2018-02-20 18:57:52

标签: database neo4j cypher graph-databases

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

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

关系:作者 - > WROTE - >纸

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

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

1 个答案:

答案 0 :(得分:1)

[EDITED]

下面是一个查询,不需要事先知道你最有成效的作者(co)写了多少篇论文。它会自动确定作者是谁,然后找到他/她的所有共同作者及其共同作者。为此,-[: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)返回每个Paperpath个节点的索引列表(因为它们有奇数索引)。

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