GraphGists

此 Gist 试图回答Neo4j 邮件列表上的此问题

我有一些网络,这些网络有很多出现在这些网络中的“自我”。这些自我反过来出现在许多不同的网络中 - 基本的多对多关系,在图数据库的上下文中,是一个二部图网络。在实践中,我的数据看起来像这样(请原谅我即将编写的任何愚蠢的格式)

Network 1: [Ego 1, Ego 2, Ego, 3, Ego 4]
Network 2: [Ego 2, Ego 4, Ego, 5, Ego 6]
Network 3: [Ego 4, Ego 5, Ego, 7, Ego 8, Ego 9, Ego 10]

我想要这些数据中获得的结果如下

我想知道网络 1 与网络 2 和网络 3 之间的关系。具体来说,我想以特定的方式衡量重叠 - 两个网络的自我交集的数量除以自我并集的数量。换句话说,网络 1 和网络 2 的比较将产生以下步骤

交集 = [自我 2,自我 4],共 2 个 并集 = [自我 1,自我 2,自我 3,自我 4,自我 5,自我 6],共 6 个 交集/并集 = 1/3

然后我会说这两个网络有 33% 的相似度(我愿意接受其他计算相似度的方法,以符合我在这里试图做的事情的精神)。

CREATE (n1:Network{name:'Network1'})
CREATE (n2:Network{name:'Network2'})
CREATE (n3:Network{name:'Network3'})
CREATE (e1:Ego{name:'Ego1'})
CREATE (e2:Ego{name:'Ego2'})
CREATE (e3:Ego{name:'Ego3'})
CREATE (e4:Ego{name:'Ego4'})
CREATE (e5:Ego{name:'Ego5'})
CREATE (e6:Ego{name:'Ego6'})
CREATE (e7:Ego{name:'Ego7'})
CREATE (e8:Ego{name:'Ego8'})
CREATE (e9:Ego{name:'Ego9'})
CREATE (e10:Ego{name:'Ego10'})
CREATE (n1)<-[:APPEARANCE]-(e1)
CREATE (n1)<-[:APPEARANCE]-(e2)
CREATE (n1)<-[:APPEARANCE]-(e3)
CREATE (n1)<-[:APPEARANCE]-(e4)
CREATE (n2)<-[:APPEARANCE]-(e2)
CREATE (n2)<-[:APPEARANCE]-(e4)
CREATE (n2)<-[:APPEARANCE]-(e5)
CREATE (n2)<-[:APPEARANCE]-(e6)
CREATE (n3)<-[:APPEARANCE]-(e4)
CREATE (n3)<-[:APPEARANCE]-(e5)
CREATE (n3)<-[:APPEARANCE]-(e7)
CREATE (n3)<-[:APPEARANCE]-(e8)
CREATE (n3)<-[:APPEARANCE]-(e9)
CREATE (n3)<-[:APPEARANCE]-(e10)

网络 1 与其他网络之间的交集

MATCH (network:Network {name: 'Network1'})<-[:APPEARANCE]-(ego:Ego)-[:APPEARANCE]->(alter_network:Network) return distinct(alter_network.name), count(ego), collect(ego.name)

网络 1 和网络 2 之间的并集

MATCH (n1:Network {name: 'Network1'}),(ego:Ego),(n2:Network{name:'Network2'})
WHERE (n1)<-[:APPEARANCE]-(ego) OR (n2)<-[:APPEARANCE]-(ego)
return count(ego), collect(ego.name)