2016-06-07 65 views
1

我有这个简单的例子:的Neo4j:避免副路径要返回

CREATE 
(P1:Person { fullname:'John Smith' }), 
(P2:Person { fullname:'Mark Almond'}), 
(P3:Person { fullname:'Mark Twain'}) 

CREATE 
(P1)-[:Friend]->(P2), 
(P2)-[:Friend]->(P3) 

当我运行以下查询:

MATCH p=(a)-[*0..2]-() 
WHERE ID(a) = 0 // john smith id 
RETURN * 

我得到显示右图所示。

然而,当我看到返回的“行”,它显示:

╒══════════════════════╤══════════════════════════════╕ 
│a      │p        │ 
╞══════════════════════╪══════════════════════════════╡ 
│{fullname: John Smith}│[{fullname: John Smith}]  │ 
├──────────────────────┼──────────────────────────────┤ 
│{fullname: John Smith}│[{fullname: John Smith}, {}, {│ 
│      │fullname: Mark Almond}]  │ 
├──────────────────────┼──────────────────────────────┤ 
│{fullname: John Smith}│[{fullname: John Smith}, {}, {│ 
│      │fullname: Mark Almond}, {}, {f│ 
│      │ullname: Mark Twain}]   │ 
└──────────────────────┴──────────────────────────────┘ 

有没有办法让仅只有最长的路径,而不是与1种或2个元素等“组合子”的路径?

回答

0

使用此为最长的路径:我用你的第一个解决方案是

MATCH p=(a)-[*0..2]->(e) 
WHERE ID(a) = 0 // john smith id 
    AND NOT (e)-->() // no further outgoing rels from end node 
RETURN * 
+0

MATCH p=(a)-[*0..2]-() WHERE ID(a) = 0 // john smith id WITH a, p ORDER by length(p) desc LIMIT 1 RETURN * 

如果路径规范使用方向(例如,只传出的关系),您可以改用好的(但我的设置太简单)。一个路径和一个案例。当我有多个相同节点的长路径时,问题就出现了。所以命令/限制技巧它不会工作(图片我添加另一个朋友约翰史密斯与其他任何其他人),因为我需要所有的路径。 – Randomize