Neo4j - 计算相似性并在节点之间插入新关系(如果不存在)

时间:2015-10-27 11:20:04

标签: neo4j cypher

编辑:  我需要检查关系是否存在。如果不存在则计算节点之间的相似性,这是比特时间。然后,我需要在它们之间插入关系。  我需要对图中的所有节点重复此操作。

此方案的程序化范例如下:

 If relationship exits
     then calculate similarity and insert relationship
 else
     do nothing (or) return value

此查询也存在问题,它也可能导致内存异常。如果是这样,如何克服这个问题。

这是我的查询,

MATCH (a{word:"review"}),(b{word:"nothing"}) 
MERGE  (a)-[r:jsim]->(b)
MERGE  (a)<-[s:jsim]-(b)
SET r.val = 
  CASE WHEN NOT (HAS (r.val)) 
    THEN [1]
  ELSE 2 END 
SET s.val = 
  CASE WHEN NOT (HAS (s.val)) 
    THEN [2]
  ELSE 1 END 
RETURN r,s

在我的实际问题中,FALSE案例有一个大查询,它遍历图中必须在堆栈中存储许多值的所有节点。所以,这里可能会出现内存异常。

我的IF ELSE CASE查询是:

MATCH (a)-[r]->(b) where r.val>1
WITH collect(DISTINCT b.word) as our_word_pairs,a
MATCH (c)-[r]->(d) where r.val>1 AND Not c = a
WITH collect(DISTINCT d.word) as other_word_pairs,a,c,our_word_pairs
WITH FILTER(X in our_word_pairs where X in other_word_pairs) AS word_pair_intersection,
(our_word_pairs+other_word_pairs) AS all_word_pairs,other_word_pairs,a,c,our_word_pairs
WITH DISTINCT(all_word_pairs) as all_word_pairs,word_pair_intersection,a,c
WITH (1.0*SIZE(word_pair_intersection)/SIZE(all_word_pairs)) AS jsim

现在 jsim 是我需要分配的值。

假设a和b是两个节点,我必须找到它们之间的相似性并添加与值的关系。 A和B的相似性是它们之间的公共节点除以它们所连接的总节点数。

Ex: A-->p,A-->q.A-->r,A-->s
    B-->r,B-->s,B-->t,B-->u,B-->v

   Sim(A,B) = Common nodes/Total Nodes
            = 2/7

0 个答案:

没有答案