【问题标题】:How to "combine" two nodes and relationships in neo4j using Cypher如何使用 Cypher 在 Neo4j 中“组合”两个节点和关系
【发布时间】:2014-02-20 17:46:24
【问题描述】:

我正在用图表建模一个“标签云”:

(t:Tag {name:'cypher'})-[:IN]->(g:TagGroup)<-[:TAGGED]-(x)

IE:命名标签是“TagGroup”的一部分,零个或多个节点是“TAGGED”的。我选择这种设计是因为我希望能够组合两个或多个命名标签(例如“cypher”和“neo4j”),这样(Tag)s 都是[IN]新的(TagGroup),新的(TagGroup) 是以前为 [TAGGED] 的所有节点的联合端点。

我唯一(不是很愉快)的尝试是:

match (t:Tag {name:'cypher'})-[i:IN]->(g:TagGroup),
(t2:Tag {name:'neo4j'})-[:IN]->(g2:TagGroup)<-[y:TAGGED]-(x)
create (t2)-[:IN]->(g) 
create unique (g)<-[:TAGGED]-(x)
with g2 as g2 
match (g2)<-[r]->() delete g2,r

我的主要问题是它只结合了两个节点,感觉效率不高(尽管我没有其他选择可以与之比较)。理想情况下,我可以按名称组合任意一组 (Tag)。

如果这可以用 Cypher 完成,有什么想法吗?如果可以,怎么做?

【问题讨论】:

  • 那么,您要做的是获取 2 个 TagGroup 并将它们合并在一起?

标签: neo4j cypher


【解决方案1】:

您可以使用标签而不是创建单独的标签组。

例如。如果标签 neo4j 和 cypher 属于标签组,比如 XYZ,那么

MERGE (a:Tag {name: "neo4j"})-[:TAGGED]->(x)
MERGE (b:Tag {name: "cypher"})-[:TAGGED]->(x)
set a :XYZ , b :XYZ

所以下次你想将特定组的标签标记到特定的帖子 x

MATCH (a:Tag:XYZ)-[:TAGGED]->(x) return a.name

【讨论】:

  • 据我了解,MERGE 创建新的节点和路径,而不是组合节点上的内容。我不认为你的解决方案会做我想要的,本质上是能够将现有的两组关系视为一个?
  • 我假设创建了新标签 neo4j 和 cypher。现在 set 子句将附加一个组标签 XYZ 。
  • 是的,当我开始我的解决方案时,我建议使用标签而不是创建单独的标签组节点和 IN 关系
  • 不,名称是用户生成的,所以事先不知道,我们需要在它们语义相同时进行分组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多