合并节点临时查询

时间:2014-08-13 15:49:06

标签: neo4j

我尝试使用搜索来查看是否有其他人问过这个问题,但我无法找到解决问题的任何内容。如果我没有看到正确的问题,请不要责怪。

正如我试图在标题中描述的那样,我想为请求合并节点。想想包含家谱的图表。我的图表中有多个系列。每个家庭都由其成员代表。所以你有一个与你兄弟A - [:hasBrother] - > B等的连接。您还可以与其他家庭建立联系。例如。您通过A - [:knows] - > C与另一个家庭的某个人相连。现在我想合并这些系列,因为我对X系列到Z系列之间的连接感兴趣。但是在这条路径上,我希望将一个系列视为一个节点,它与其他系列节点有连接。这可能与Neo4j有关吗?

我有一个例子:

A is part of Family 1; b,c,d is part of Family 2; e is part of family 3

A<-->B

B<-->C

C<-->D

D<-->E

E<-->F

当我在寻找家庭1之间的连接长度时,我希望得到两个结果。

我希望你能得到我的问题,你能帮助我。 至少,感谢阅读!

1 个答案:

答案 0 :(得分:1)

是的,你可以这样做。首先,您需要一种识别家庭的方法。我将展示一个简单的例子,假设姓氏标识了家族,并且您拥有这些数据。就像一张纸条,它可能不那么简单,但作为一个例子,我需要使用一些东西:

MATCH (p:Person)
MERGE (f:Family { name: p.lastName }) // Create a family with this last name.
MERGE (p)-[:part_of]->(f);   // Link everybody to the right family.

现在你想要做的很简单:

MATCH (f1:Family)<-[:part_of]-(p1:Person)-[:knows]->(p2)-[:part_of]->(f2:Family)
WHERE f1 <> f2 and f1.id < f2.id
MERGE (f1)-[:knows]->(f2)

基本上,这表示当你有两个不同的家庭(f1和f2),这些家庭的人彼此认识时,那些家庭彼此认识。我添加了一个排序谓词(f1.id&lt; f2.id),以防止在两个方向上考虑相同的对。

请注意,根据您拥有的“知道”链接数量,这可能需要一些时间才能运行。基本上,您必须考虑每个成对的人关系才能正确更新链接。

您不必实现家庭彼此了解的事实。请注意,在第二个查询的MATCH子句中,我们已经知道f1和f2彼此了解。如果您可以根据需要重新运行该匹配,则不必实际创建从f1到f2的新关系。