校园网站怎么做HTML,阿里云部署多个网站,wordpress访问次数,wordpress中的邮箱设置最近#xff0c;我阅读了Michal Bachman关于 Neo4j中双向关系的文章 #xff0c;他建议对于某些关系类型#xff0c;我们对关系的方向不那么感兴趣#xff0c;因此可以在查询时忽略它。 他使用以下示例显示了Neo Technology和GraphAware之间的合作关系#xff1a; 两家公… 最近我阅读了Michal Bachman关于 Neo4j中双向关系的文章 他建议对于某些关系类型我们对关系的方向不那么感兴趣因此可以在查询时忽略它。 他使用以下示例显示了Neo Technology和GraphAware之间的合作关系 两家公司都是彼此的合作伙伴但是由于我们可以尽快找到传入和传出的关系因此我们最好在两家公司/节点之间只有一种关系。 当我们想使图中的隐式关系明确时经常会出现这种模式。 例如我们可能有以下图形描述了他们所从事的人员和项目 我们可以使用以下密码语法在Neo4j 2.0中创建该图 CREATE (mark:Person {name: Mark})
CREATE (dave:Person {name: Dave})
CREATE (john:Person {name: John})CREATE (projectA:Project {name: Project A})
CREATE (projectB:Project {name: Project B})
CREATE (projectC:Project {name: Project C})CREATE (mark)-[:WORKED_ON]-(projectA)
CREATE (mark)-[:WORKED_ON]-(projectB)
CREATE (dave)-[:WORKED_ON]-(projectA)
CREATE (dave)-[:WORKED_ON]-(projectC)
CREATE (john)-[:WORKED_ON]-(projectC)
CREATE (john)-[:WORKED_ON]-(projectB) 如果我们想弄清楚哪些人彼此认识我们可以编写以下查询 MATCH (person1:Person)-[:WORKED_ON]-()-[:WORKED_ON]-(person2)
RETURN person1, person2 -------------------------------------------------------| person1 | person2 |-------------------------------------------------------| Node[500363]{name:Mark} | Node[500364]{name:Dave} || Node[500363]{name:Mark} | Node[500365]{name:John} || Node[500364]{name:Dave} | Node[500363]{name:Mark} || Node[500364]{name:Dave} | Node[500365]{name:John} || Node[500365]{name:John} | Node[500364]{name:Dave} || Node[500365]{name:John} | Node[500363]{name:Mark} |-------------------------------------------------------6 rows 我们可能要在每对人之间创建一个KNOWS关系 MATCH (person1:Person)-[:WORKED_ON]-()-[:WORKED_ON]-(person2)
CREATE UNIQUE (person1)-[:KNOWS]-(person2)
RETURN person1, person2 现在如果我们运行一个查询忽略关系方向以找出哪些人彼此认识我们将得到很多重复的结果 MATCH path(person1:Person)-[:KNOWS]-(person2)
RETURN person1, person2, path --------------------------------------------------------------------------------------------------------------------------------| person1 | person2 | path |--------------------------------------------------------------------------------------------------------------------------------| Node[500363]{name:Mark} | Node[500364]{name:Dave} | [Node[500363]{name:Mark},:KNOWS[528536]{},Node[500364]{name:Dave}] || Node[500363]{name:Mark} | Node[500365]{name:John} | [Node[500363]{name:Mark},:KNOWS[528537]{},Node[500365]{name:John}] || Node[500363]{name:Mark} | Node[500364]{name:Dave} | [Node[500363]{name:Mark},:KNOWS[528538]{},Node[500364]{name:Dave}] || Node[500363]{name:Mark} | Node[500365]{name:John} | [Node[500363]{name:Mark},:KNOWS[528541]{},Node[500365]{name:John}] || Node[500364]{name:Dave} | Node[500363]{name:Mark} | [Node[500364]{name:Dave},:KNOWS[528538]{},Node[500363]{name:Mark}] || Node[500364]{name:Dave} | Node[500365]{name:John} | [Node[500364]{name:Dave},:KNOWS[528539]{},Node[500365]{name:John}] || Node[500364]{name:Dave} | Node[500363]{name:Mark} | [Node[500364]{name:Dave},:KNOWS[528536]{},Node[500363]{name:Mark}] || Node[500364]{name:Dave} | Node[500365]{name:John} | [Node[500364]{name:Dave},:KNOWS[528540]{},Node[500365]{name:John}] || Node[500365]{name:John} | Node[500364]{name:Dave} | [Node[500365]{name:John},:KNOWS[528540]{},Node[500364]{name:Dave}] || Node[500365]{name:John} | Node[500363]{name:Mark} | [Node[500365]{name:John},:KNOWS[528541]{},Node[500363]{name:Mark}] || Node[500365]{name:John} | Node[500363]{name:Mark} | [Node[500365]{name:John},:KNOWS[528537]{},Node[500363]{name:Mark}] || Node[500365]{name:John} | Node[500364]{name:Dave} | [Node[500365]{name:John},:KNOWS[528539]{},Node[500364]{name:Dave}] |--------------------------------------------------------------------------------------------------------------------------------12 rows 每对人出现4次如果我们以Mark和Dave为例我们可以看到原因 MATCH path(person1:Person)-[:KNOWS]-(person2)
WHERE person1.name Mark AND person2.name Dave
RETURN person1, person2, path --------------------------------------------------------------------------------------------------------------------------------| person1 | person2 | path |--------------------------------------------------------------------------------------------------------------------------------| Node[500363]{name:Mark} | Node[500364]{name:Dave} | [Node[500363]{name:Mark},:KNOWS[528536]{},Node[500364]{name:Dave}] || Node[500363]{name:Mark} | Node[500364]{name:Dave} | [Node[500363]{name:Mark},:KNOWS[528538]{},Node[500364]{name:Dave}] |--------------------------------------------------------------------------------------------------------------------------------2 rows 如果我们看一下路径栏下有两个不同的KNOWS关系与IDS 528536和528538马克和戴夫一个去之间从马克戴夫和其他来自Dave马克。 正如Michal在他的帖子中指出的那样在这种情况下不需要两个关系。 我们只需要一种关系可以通过创建KNOWS关系时不指定方向来实现 MATCH (person1:Person)-[:WORKED_ON]-()-[:WORKED_ON]-(person2)
CREATE UNIQUE (person1)-[:KNOWS]-(person2)
RETURN person1, person2 现在如果我们重新运行查询以检查Mark和Dave之间的关系则只有一个 MATCH path(person1:Person)-[:KNOWS]-(person2) WHERE person1.name Mark AND person2.name Dave RETURN person1, person2, path --------------------------------------------------------------------------------------------------------------------------------| person1 | person2 | path |--------------------------------------------------------------------------------------------------------------------------------| Node[500375]{name:Mark} | Node[500376]{name:Dave} | [Node[500375]{name:Mark},:KNOWS[528560]{},Node[500376]{name:Dave}] |--------------------------------------------------------------------------------------------------------------------------------1 row 在这种情况下关系从Mark到Dave可以通过执行一些考虑方向的查询来看到 MATCH path(person1:Person)-[:KNOWS]-(person2)
WHERE person1.name Mark AND person2.name Dave
RETURN person1, person2, path --------------------------------------------------------------------------------------------------------------------------------| person1 | person2 | path |--------------------------------------------------------------------------------------------------------------------------------| Node[500375]{name:Mark} | Node[500376]{name:Dave} | [Node[500375]{name:Mark},:KNOWS[528560]{},Node[500376]{name:Dave}] |--------------------------------------------------------------------------------------------------------------------------------1 rowMATCH path(person1:Person)-[:KNOWS]-(person2)
WHERE person1.name Mark AND person2.name Dave
RETURN person1, person2, path --------------------------| person1 | person2 | path |----------------------------------------------------0 row 参考 Neo4j通过Mark Needham博客博客的JCG合作伙伴 Mark Needham 使隐式关系成为显式和双向关系 。 翻译自: https://www.javacodegeeks.com/2013/10/neo4j-making-implicit-relationships-explicit-bidirectional-relationships.html