2015-01-12 73 views
0

我有一个看起来像这样的数据集(Artefact) - [HAS] - (关键字),关键字可以被artefacts多次共享。我试图达到的是;Neo4j - 获取类型的所有相关节点并创建新的关系

返回大多数相互关联的关键字节点,与关键词有关的假象的数量,关键字节点之间的重叠计数以及到另一个关键字(关键字) - (artefact) - (关键字)的跳数,两个“共享”关键字。

换句话说,在两个关键字节点之间的相交内的人工记录计数。例如,给定这三个伪影节点

1)(关键字; 金属,食品)

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

3)(关键字; 金属,食品)

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

一旦我解决了这个问题,为了提高速度,我意识到这是一个很大的查询,请在关键字之间创建一个related_to关系,并将它们共享的artefact的数量计算在内。只能选择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),

非常感谢,安迪

回答

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 
相关问题