一组节点之间的Neo4J连通性和推荐

一组节点之间的Neo4J连通性和推荐,neo4j,cypher,igraph,graph-databases,Neo4j,Cypher,Igraph,Graph Databases,我的数据库包含一组节点和一种数字类型的关系。给定一组节点,我希望查看它们是否以及如何相互连接,并查找可以包含的节点。很抱歉,我无法合成数据。您可以将每个节点视为一个城市,其关系是一个距离。如果这种关系不存在,就意味着从A城市到B城市没有直接的道路。这个想法有两个方面:1)找出这些城市之间是否有联系,以及如何联系。2) 寻找其他中间城市 例如,如果我有A,B,C,D和E,一种方法是做一个成对的最短距离。该图是无方向的,因此A-B与B-A相同 MATCH (n:people {name:'A'})-

我的数据库包含一组节点和一种数字类型的关系。给定一组节点,我希望查看它们是否以及如何相互连接,并查找可以包含的节点。很抱歉,我无法合成数据。您可以将每个节点视为一个城市,其关系是一个距离。如果这种关系不存在,就意味着从A城市到B城市没有直接的道路。这个想法有两个方面:1)找出这些城市之间是否有联系,以及如何联系。2) 寻找其他中间城市

例如,如果我有A,B,C,D和E,一种方法是做一个成对的最短距离。该图是无方向的,因此A-B与B-A相同

MATCH (n:people {name:'A'})-[r:INTERACTION]-(n2:people {name:'B'}),
      p = shortestPath ((n)-[*]-(n2))
RETURN p
但是,我可以这样做,而不是做
(n*n-1)/2次:

MATCH (n:people)-[r:INTERACTION]-(n2:people)
MATCH spath=shortestPath ((n)-[*]-(n2))
WHERE n.name in ['A', 'B', 'C', 'D', 'E'] and n2.name in ['A', 'B', 'C', 'D', 'E']
RETURN DISTINCT n.name, n2.name, r.score 

尽管如此,对于第二个目标,即寻找其他中间城市,我想知道在neo4j中是否有其他进行此类分析的概念,如果没有,您如何确保每对的输出是不同的,这意味着没有A-B和B-A输出,当然,如果您有一组数据,并且希望使用不包含重复项的唯一集执行某些操作,那么最好先生成该唯一集的项,然后将其传递给查询,这样您就不必执行不必要的查询,然后放弃重新装载信息后来

要生成一组对集的uniqe集,可以执行以下操作

// unwind the name collection twice to get all combinations
WITH ['A', 'B', 'C', 'D', 'E'] AS names
UNWIND names AS name1
UNWIND names AS name2

// makes sure the pairs are ordered and ignore identical pairs
WITH CASE 
       WHEN name1 = name2 THEN NULL 
       WHEN name2 < name1 THEN [name2, name1] 
       ELSE [name1, name2] 
     END AS pair

// collect all of the pairs
RETURN COLLECT (DISTINCT pair) AS pairs
把它和你的查询放在一起,你可以这样做

// from above
WITH ['A', 'B', 'C', 'D', 'E'] AS names
UNWIND names AS name1
UNWIND names AS name2
WITH CASE WHEN name1 = name2 THEN NULL WHEN name2 < name1 THEN [name2, name1] ELSE [name1, name2] END AS pair
WITH COLLECT (DISTINCT pair) AS pairs

// iterate over the unique pairs
UNWIND pairs AS pair

// find the shortest path 
// from  
// the first node identified by the first value in the pair
// to 
// the second node identified by the second value in the pair
MATCH spath = shortestPath((:people {name: pair[0]} )-[*..5]-(:people {name: pair[1]} ))

// produce a string representation of each path 
RETURN reduce(string = "", rel in relationships(spath) | string + startNode(rel).name + " " + type(rel) + " " + endNode(rel).name + ", ")
//从上面
以['A','B','C','D','E']作为名称
将名称作为名称1展开
将名称作为名称2展开
当name1=name2时为CASE,当name2

此查询将返回来自您的“目的地”集合的最小路径集,不会有任何重复。

看起来不错-我认为spath上需要一个“distinct”命令?出于某种原因,我看到了重复的spath-但是如果我添加distinct,它看起来会更好。如果顶部返回一组不同的对,那么您将返回一组不同的路径。可能一条路径包含在另一条路径中;想象一个连续的城市线。至于第二个目标,我不确定我是否理解,路径将包含所有中间城市。你是对的。关于第二个目标,我想我需要提出另一个问题。当你在这里回答时,完美地完成了这个问题。如果A紧挨着B,A也紧挨着C。如果发生这种情况,B和C连接到D(即使D没有连接到A)。我想在neo4j wo事后分析中指出这一点!但同样,这可能需要另一个单独的问题。我添加了一个APOC替代方案来创建组合。很好-不幸的是,我今天上午被抨击了,无法发表任何评论。如果在一天结束时它仍然在那里,我会试试看
// from above
WITH ['A', 'B', 'C', 'D', 'E'] AS names
UNWIND names AS name1
UNWIND names AS name2
WITH CASE WHEN name1 = name2 THEN NULL WHEN name2 < name1 THEN [name2, name1] ELSE [name1, name2] END AS pair
WITH COLLECT (DISTINCT pair) AS pairs

// iterate over the unique pairs
UNWIND pairs AS pair

// find the shortest path 
// from  
// the first node identified by the first value in the pair
// to 
// the second node identified by the second value in the pair
MATCH spath = shortestPath((:people {name: pair[0]} )-[*..5]-(:people {name: pair[1]} ))

// produce a string representation of each path 
RETURN reduce(string = "", rel in relationships(spath) | string + startNode(rel).name + " " + type(rel) + " " + endNode(rel).name + ", ")