我有一个看起来像这样的数据集(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
答案 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
但是,我猜你可以直接在相关节点之间建立关系:
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