使用Dijkstra算法在每个节点上显示一个事件并在neo4j中找到最短路径

时间:2017-08-02 11:32:44

标签: algorithm neo4j cypher dijkstra

我正在开发一个使用neo4j的应用程序。 我使用CSV文件在neo4j中导入了我的数据库,并创建了节点和关系。 我的数据库包含3列,Anumber,Bnumber和DateTime。此DB代表来自ANUMBER -> BNUMBER DATETIME

的来电记录

所以我在neo4j Browser

上使用这些命令创建了节点和关系
LOAD CSV WITH HEADERS FROM "file:///2.csv" AS ROW
CREATE (a:ANUMBER {aNumber:ROW.aNumber} )
CREATE (b:BNUMBER {bNumber:ROW.bNumber} )
MERGE (a)-[:CALLED]->(b);

这成功创建了两个节点,一个关系和两个属性键。

现在我面临两个问题。

第一个 是当我查询与单个节点相关的数据时它会为每次出现创建新的圆圈。我使用过这个查询

MATCH p=(a:ANUMBER)-[r:CALLED]->(b:BNUMBER)
WHERE a.aNumber = "3217913664"
RETURN p 

这会产生正确的响应但是它为3217913664和任何其他数字之间的每个关系创建了新的圆圈。请参阅附图。我需要为3217913664显示一个圆,并且所有边都从单个圆出来并创建所需的圆和边。此图显示了3217913664的23个节点但是我只需要按预期显示3217913664和其他节点的一个节点。 enter image description here

第二个 是我需要显示两个数字之间的所有最短路径。让我们说

123 called 456,789,000,222
000 called 333,555,999
999 called 963
456 called 963
123 called 963

所以我需要找到123和963之间的所有最短路径,它们是:

123 -> 000 -> 999 -> 963
123 -> 456 -> 963
123 -> 963

任何想法如何解决这两个问题。我已经使用GraphStream实现了这些场景但是我需要使用Cypher查询语言在neo4j中实现相同的用例

1 个答案:

答案 0 :(得分:1)

我认为您的第一个问题与导入脚本有关。您正在为CSV中的每一行创建a号码和b号码。这可能导致23个节点的编号为3217913664.要解决此问题,请将CREATE语句替换为MERGE,如下所示:

LOAD CSV WITH HEADERS FROM "file:///2.csv" AS ROW
MERGE (a:ANUMBER {aNumber:ROW.aNumber} )
MERGE (b:BNUMBER {bNumber:ROW.bNumber} )
MERGE (a)-[:CALLED]->(b);

关于第二个问题:可能您正在寻找allShortestPath功能。