我有下表,其中说明每个Originator执行的任务的频率。 (请参阅附图)。
Task-Frequency for each Originators
我在Neo4j中代表了上表,关系是发起人 - [频率] - >任务。
现在我需要使用Cypher查询来计算两个用户之间的相似性(例如,Jaccard相似性)。想知道它是如何可能的,或者是否会完全改变模式定义。
提前致谢。
答案 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
中。然后它使用单独匹配(可选)每个用户的任务并使用它们来计算union
(COLLECT
将创建零长度数组,其中零匹配)。在最终的回报声明中可能存在零除问题。
频率应如何影响结果很难说,我想知道是否可以通过将:Frequency
与:Completed
交换并为每个完成的任务创建新关系(即&之间的6个关系)来提供更好的服务#39;约翰&#39;行动A&#39;)。这对于支持intersection
非常有用,但仍然会为Union
提供有趣的内涵。
答案 1 :(得分:1)
该链接解决了我的问题。只需要考虑每个环节。
http://neo4j.com/docs/stable/cypher-cookbook-similarity-calc.html