Neo4j - 获取类型的所有相关节点并创建新关系
Neo4j - Get all related nodes of type and create new relationship
我有一个看起来像这样的数据集(Artefact)-[HAS]-(关键字),关键字可以被人工制品多次共享。我想要达到的目标是;
返回大多数相互关联的关键字节点、与关键字相关的人工制品计数、关键字节点之间的重叠计数以及跳到另一个关键字 (keyword)-(artefact)-(keywords),"shared" 人工制品算在两个关键字之间。
换句话说,两个关键字节点之间的交集内的人工制品记录计数。例如给定这三个人工制品节点
1) 勺子(关键词;金属,食物)
2) sword (关键词; metal, fighting)
3) 叉子(关键词;金属,食物)
因此查询将 return 关键字节点,与关键字相关的人工制品计数(3,勺子,剑和叉子),关键字节点之间人工制品相关的关键字计数(金属有 2 个间接连接食物和 1 战斗)。
一旦我解决了这个问题,为了提高速度,因为我意识到这是一个很大的查询,在关键字之间创建一个 related_to 关系,计算它们共有的人工制品的数量。只有 select 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),
非常感谢,安迪
此查询将 return 您回答的第一部分:
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
我有一个看起来像这样的数据集(Artefact)-[HAS]-(关键字),关键字可以被人工制品多次共享。我想要达到的目标是;
返回大多数相互关联的关键字节点、与关键字相关的人工制品计数、关键字节点之间的重叠计数以及跳到另一个关键字 (keyword)-(artefact)-(keywords),"shared" 人工制品算在两个关键字之间。
换句话说,两个关键字节点之间的交集内的人工制品记录计数。例如给定这三个人工制品节点
1) 勺子(关键词;金属,食物)
2) sword (关键词; metal, fighting)
3) 叉子(关键词;金属,食物)
因此查询将 return 关键字节点,与关键字相关的人工制品计数(3,勺子,剑和叉子),关键字节点之间人工制品相关的关键字计数(金属有 2 个间接连接食物和 1 战斗)。
一旦我解决了这个问题,为了提高速度,因为我意识到这是一个很大的查询,在关键字之间创建一个 related_to 关系,计算它们共有的人工制品的数量。只有 select 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),
非常感谢,安迪
此查询将 return 您回答的第一部分:
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