0

我有一个我查询的 Neo4J 数据库,例如获取 E 和 F 之间的最短路径(但它可以是数据库的任何子图)。我使用 R 中的 RNeo4J 驱动程序来执行此操作。

我想使用 Cypher 将路径作为边缘列表返回给 R,以便我可以直接使用边缘列表来创建 Igraph 对象并绘制或分析它。

我是 Cypher 的新手,但一直在使用浏览器尝试以下查询行中的某些内容:

"MATCH p = shortestpath((n)-[*..5]->(m))
WHERE n.nodename = 'E' AND m.nodename = 'F'
WITH p 
MATCH (f)-->(t) 
WHERE f IN nodes(p) AND t IN nodes(p) 
RETURN DISTINCT f.nodename, t.nodename"

这会生成一个包含最短路径的边列表(例如 E->G->F),但还包括一些不在最短路径上的节点(例如 I 和 C)但与其相邻的节点为 (E->C, C-> E, 和 G->I->F)...

我在正确的轨道上吗?如何确保在我的第二个 MATCH 语句中只考虑最短路径中的节点?有更好的方法吗?任何帮助将不胜感激。

/詹尼克

4

1 回答 1

1

这应该按路径顺序获取最短路径中每个关系的开始和结束节点的名称:

MATCH shortestpath((n)-[rels*..5]->(m))
WHERE n.nodename = 'E' AND m.nodename = 'F'
UNWIND rels AS rel
RETURN STARTNODE(rel).nodename AS s, ENDNODE(rel).nodename AS e;
于 2017-05-01T05:30:33.397 回答