我正在 Neo4j 中构建相似度图,并且 gds.nodeSimilarity.stats 报告我正在使用的投影的平均相似度得分在 0.60 到 0.85 范围内,无论我如何转换图。我试过了:
- 仅投影边权重大于 1 的关系
- 删除核心节点以增加组件数量(我的图表是关于单个主题,核心节点代表该主题)
- 将其更改为无向图
我意识到我总是可以将 gds.nodeSimilarity.write 中的similarityCutoff 设置为更高的值,但我在猜测自己,因为我用于训练的所有玩具问题,包括 Neo4j 的实践,平均 Jaccard 分数都低于 0.5。我是不是想多了,还是有什么不对劲的迹象?
*** 编辑添加*** 这是一个有两种类型节点的图:帖子和实体。帖子反映了各种媒体类型,而实体反映了各种作者和专有名词。在这种情况下,我主要关注 Twitter。一些关系示例:
(e1 {Type:TwitterAccount})-[TWEETED]->(p:Post {Type:Tweet})-[AT_MENTIONED]->(e2 {Type:TwitterAccount})
(e1 {Type:TwitterAccount})-[TWEETED]->(p2:Post {Type:Tweet})-[QUOTE_TWEETED]->(p2:Post {Type:Tweet})-[AT_MENTIONED]->(e2 {Type :推特账号})
对于我的代码,我首先尝试仅投影 AT_MENTIONED 关系:
- 调用 gds.graph.create('similarity_graph', ["Entity", "Post"], "AT_MENTIONED")
我试过用相反的方向这样做:
CALL gds.graph.create('similarity_graph', ["Entity", "Post"], {AT_MENTIONED:{type:'AT_MENTIONED', orientation:'REVERSE'}})
我尝试在具有 RELATED_TO 关系的所有节点之间创建单方加权关系......
MATCH (e1:Entity)-[*2..3]->(e2:Entity) WHERE e1.Type = 'TwitterAccount' AND e2.Type = 'TwitterAccount' AND id(e1) < id(e2) WITH e1, e2, count(*) as strength MERGE (e1)-[r:RELATED_TO]->(e2) SET r.strength
= strength
...然后投影:
CALL gds.graph.create("similarity_graph", "Entity", "RELATED_TO")
无论我尝试上述哪种方法,然后通过运行以下命令获得我的 Jaccard 发行版:
CALL gds.nodeSimilarity.stats('similarity_graph') YIELD nodesCompared, similarityDistribution