为Neo4j动态创建关系

为Neo4j动态创建关系,neo4j,cypher,Neo4j,Cypher,我是新来的Neo4j,我很高兴学习。 目前,我正在使用一个电影数据库,试图解决一个问题,即我需要根据演员们共同拍摄的电影来建立演员之间的关系 例如,哈里森·福特和亚历克·吉尼斯在同4部电影中扮演角色。哈里森·福特的电影总数为34部,亚历克·吉尼斯的电影总数为16部 我想在飞行中建立关系,说: "Harrison Ford"-[:SAME_MOVIE{weight: 0.12 }]->"Alec Guiness" "Alec Guiness"-[:SAME_MOVIE{weight: 0.

我是新来的
Neo4j
,我很高兴学习。 目前,我正在使用一个电影数据库,试图解决一个问题,即我需要根据演员们共同拍摄的电影来建立演员之间的关系

例如,哈里森·福特和亚历克·吉尼斯在同4部电影中扮演角色。哈里森·福特的电影总数为34部,亚历克·吉尼斯的电影总数为16部

我想在飞行中建立关系,说:

"Harrison Ford"-[:SAME_MOVIE{weight: 0.12 }]->"Alec Guiness"

"Alec Guiness"-[:SAME_MOVIE{weight: 0.25 }]->"Harrison Ford"
我被困在这个计算和别名,如果有人能帮助我,我会非常感激

MATCH (a:Actor{name:"Alec Guinness"})-[x:ACTS_IN]->(:Movie)<-[y:ACTS_IN]-(b:Actor{name:"Harrison Ford"})
RETURN {start: a.name, rel: count(x), end : b.name}

MATCH(a:Actor{name:“Alec Guinness”})-[x:ACTS_IN]->(:Movie)既然您需要共同的电影计数以及两位演员所演电影的总数,您可以尝试类似的方法

MATCH (a:Actor{name:"Alec Guinness"})-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(b:Person{name:"Harrison Ford"}) 
WITH a,b,count(m) as common,
size(a-[:ACTED_IN]->()) as totalA,
size(b-[:ACTED_IN]->()) as totalB 
MERGE (a)-[:SAME_MOVIE {weight: formula}]-(b)

谢谢你的帮助,卢安。它正接近我想要的。在这种情况下,我不希望使用merge创建物理关系,而是希望动态创建此关系以进行排序并减少物理大小。是否可以使用RETURN而不是merge?此外,我的公式只是common/totalA,但关系中存储的数据似乎只是0值(应该是十进制)。敬请告知。希望我正确理解您的意思-您可以使用计算来订购,然后返回演员,或者执行进一步的匹配。见更新的答案这正是我需要的。我在除法中加入了toFloat函数,得到了一个正确的数字。我会把你的答案标为正确答案。非常感谢!!没问题。如果要在运行时反复计算这些关系,您可能需要考虑真正创建这些关系。空间不应该是一个问题。为了保持权重的更新,您可以随时触发演员/电影更新的重新计算。事实上,我在一开始就考虑了这一点。但是看看我的数据,它有一百万个节点,我正试图连接所有这些节点,计算器给了我一个难以置信的可怕的高清大小。然而,我将尝试这些性能,看看我能做些什么。
MATCH (a:Actor)-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(b:Person) 
WITH a,b,count(m) as common,
size(a-[:ACTED_IN]->()) as totalA,
size(b-[:ACTED_IN]->()) as totalB 
WITH a,b,<formula using common,totalA,totalB> as weight
ORDER BY weight
RETURN a,b