计算Neo4j中节点之间的相似性

时间:2014-11-05 10:39:51

标签: neo4j graph-databases

我有下表,其中说明每个Originator执行的任务的频率。 (请参阅附图)。

Task-Frequency for each Originators

我在Neo4j中代表了上表,关系是发起人 - [频率] - >任务

现在我需要使用Cypher查询来计算两个用户之间的相似性(例如,Jaccard相似性)。想知道它是如何可能的,或者是否会完全改变模式定义。

提前致谢。

2 个答案:

答案 0 :(得分:1)

这更像是一个起点,然后是一个答案!如果我们首先忽略频率的值,那么我认为你可以尝试类似的东西:

MATCH (u1:Originator{name:'John'}), (u2:Originator{name:'Sue'})
WITH u1, u2
OPTIONAL MATCH common=(u1)-[:FREQUENCY]->(t:Task)<-[:FREQUENCY]-(u2)
WITH u1, u2, COUNT(common) as intersection
OPTIONAL MATCH (u1)-[:FREQUENCY]->(t:Task)
WITH u1, u2, intersection, COLLECT(DISTINCT t) AS t1s
OPTIONAL MATCH (u2)-[:FREQUENCY]->(t:Task)
WHERE NOT t IN t1s
WITH u1, u2, intersection, t1s + COLLECT(DISTINCT t) AS union
RETURN u1, u2, intersection / union as js

这绝对是未经测试的,并且可能通过某种方式找不到重复匹配任务的效率。

查询正在做的是找到两个用户共有的任务,并将常见任务的数量存储在变量intersection中。然后它使用单独匹配(可选)每个用户的任务并使用它们来计算unionCOLLECT将创建零长度数组,其中零匹配)。在最终的回报声明中可能存在零除问题。

频率应如何影响结果很难说,我想知道是否可以通过将:Frequency:Completed交换并为每个完成的任务创建新关系(即&之间的6个关系)来提供更好的服务#39;约翰&#39;行动A&#39;)。这对于支持intersection非常有用,但仍然会为Union提供有趣的内涵。

答案 1 :(得分:1)

该链接解决了我的问题。只需要考虑每个环节。

http://neo4j.com/docs/stable/cypher-cookbook-similarity-calc.html