Neo4j - 获取所有类型的相关节点并创建新关系

时间:2015-01-12 13:47:19

标签: neo4j relationship graph-theory graph-databases

我有一个看起来像这样的数据集(Artefact) - [HAS] - (关键字),关键字可以通过人工制品多次共享。我想要实现的是;

返回大多数相互关联的关键字节点,与关键字相关的人工制品数量,关键字节点之间重叠的计数以及跳转到另一个关键字(关键字) - (人工制品) - (关键字),"共享"两个关键字之间的人工制品数量。

换句话说,在两个关键字节点之间的交叉点内的人工制品记录的计数。例如,给定这三个假象节点

1)勺子(关键词; 金属,食物)

2)(关键字; 金属,战斗)

3) fork (关键字; 金属,食物)

因此,查询将返回关键字节点,与关键字(3,勺子,剑和叉)相关的人工制品数量,关键字节点之间由人工制品相关的关键字计数(金属与食物有2个间接连接,1与战斗有关)。

一旦我完成了这项工作,为了速度,因为我意识到这是一个大问题,请在关键字之间创建一个related_to关系,并将它们共同拥有的人工制品数量计算在一起。只选择1条记录来创建这种关系,以测试它的工作原理:)(因此限制1)

MATCH (n:Keyword)-[r*2]-(x:Keyword)
WITH n, COUNT(r) AS c, x
LIMIT 1
MERGE (n)-[s:RELATED_KEY]-(x) SET s.weight = c

我正在使用neo4j社区版(2.1.6),

非常感谢,Andy

1 个答案:

答案 0 :(得分:1)

此查询将返回您答案的第一部分:

MATCH (k:Keyword)
WITH k
LIMIT 1
MATCH (k)<-[:HAS]-(a)
WITH k, collect(a) as artefacts
WITH k, artefacts, size(artefacts) as c
UNWIND artefacts as artefact
MATCH (k)<-[:HAS]-(artefact)-[:HAS]->(k2)
RETURN c, artefacts, collect(distinct(k2.name)) as keywords, count(distinct(k2.name)) as keyWordsCount

enter image description here

但是,我猜你可以直接在相关节点之间建立关系:

MATCH (k:Keyword)
WITH k
LIMIT 1
MATCH (k)<-[:HAS]-(a)-[:HAS]->(other)
MERGE (k)-[r:RELATED_TO]->(other)
ON CREATE SET r.weight = 1
ON MATCH SET r.weight = r.weight + 1