根据查询结果在neo4j中创建边

时间:2018-05-27 08:43:26

标签: graph neo4j cypher

我正在将电子商务软件中的搜索词转换图建模为节点(术语)和边(转换)的图形。如果用户输入例如在搜索栏中iphone,然后将查询细化为iphone 6s,这将被建模为两个节点和这些节点之间的边缘。不同用户的术语的相同转换将导致节点之间的若干边缘。

enter image description here

我现在想要创建一个累积权重为4的边缘来表示4个用户完成了这个特定的过渡。如何将count(*)查询的结果与创建查询相结合,以生成具有属性weight = 4的边

我的count(*)查询是:

MATCH (n:Term)-[r]->(n1:Term)
RETURN type(r), count(*)

我希望合并后的查询看起来像这样,但cypher中似乎无法使用这种类似sql的组合:

MATCH (n:Term), (n1:Term)
WHERE (n)-[tr:TRANSITION]->(n1)
CREATE (n)-[actr:ACC_TRANSITION {count: 
    MATCH (n:Term)-[r]->(n1:Term) RETURN 
    count(*)}
]->(n1)
RETURN n, n1

产生有效累积转换的非通用查询是:

MATCH (n:Term), (n1:Term)
WHERE n.term = 'iphone' AND n1.term ='iphone 6s'
CREATE (n)-[actr:ACC_TRANSITION {count: 4}]->(n1)
RETURN n, n1

关于如何处理和建模此问题的任何其他想法?

2 个答案:

答案 0 :(得分:3)

像这样使用WITH:

MATCH (n:Term)-[r]->(n1:Term)
WITH n as n, count(*) as rel_count, n1
CREATE (n)-[:ACC_TRANSITION {count:rel_count}]->(n1)
RETURN n, n1

答案 1 :(得分:0)

如果先匹配节点和关系,然后使用set,则不会产生重复的节点或关系

Match (n:Term)-[r]->(n1.Term)
with n as nn,count(r) as rel_count,n1 as nn1
set r.ACC_TRANSITION=rel_count
return nn,nn1,r

create函数将创建重复项。