我有以下图表
我尝试在Neo4j中对上图进行建模,以便对于任何重复节点(比如说A),属性“计数”#39;在节点上递增以反映出现的次数A.类似地,对于任何重复的关系(例如A-> B),属性频率为'已更新。
图表的Neo4j控制台已实施here。
我以上述方式对图形建模,记住我可以跟踪每个节点和每个单独过渡的出现次数。
我的要求的下一部分是跟踪所有3节点路径,这是我发出的查询,其输出在Neo4j控制台中可见 -
MATCH (n)-[]->(m)-[]->(p) return n.name+' - '+m.name+' - '+p.name as NewName
但是,我想要的输出是 -
A - B - C
B - D - A
D - A - B
B - D - E
E - B - C
D - E - B
A - B - D
但由于节点和关系是唯一的,因此还会报告一个额外的组合。
E - B - D
问题
我需要在图表设置/查询中更改哪些内容,以便仅报告列出的7种组合而不是8种组合?
有没有办法计算这种3节点路径的频率?
我可以创建多个CYPHER脚本来实现这一目标。话虽这么说,CYPHER脚本是作为更大工作流程的一部分自动生成的,我想避免手动输入n节点路径及其频率。
答案 0 :(得分:3)
您应该更改数据模型。您无需计算和更新count
和frequency
属性;相反,它们可以直接从适当的数据模型中获得。
例如,让我们使用备用数据模型来创建样本数据。每个命名节点都表示为Foo
节点。 Foo
节点的每次使用都由Bar
节点表示,该节点通过Foo
关系引用其FOR
节点。 Bar
个节点通过NEXT
关系链接在一起。
CREATE (a:Foo {name: 'A'}), (b:Foo {name: 'B'}), (c:Foo {name: 'C'}), (d:Foo {name: 'D'}), (e:Foo {name: 'E'})
CREATE (a1:Bar)-[:FOR]->(a), (b1:Bar)-[:FOR]->(b),
(a1)-[:NEXT]->(b1)
CREATE (c1:Bar)-[:FOR]->(c),
(b1)-[:NEXT]->(c1)
CREATE (d1:Bar)-[:FOR]->(d),
(b1)-[:NEXT]->(d1)
CREATE (a2:Bar)-[:FOR]->(a),
(d1)-[:NEXT]->(a2)
CREATE (b2:Bar)-[:FOR]->(b),
(a2)-[:NEXT]->(b2)
CREATE (e1:Bar)-[:FOR]->(e),
(d1)-[:NEXT]->(e1)
CREATE (b3:Bar)-[:FOR]->(b),
(e1)-[:NEXT]->(b3)
CREATE (c2:Bar)-[:FOR]->(c),
(b3)-[:NEXT]->(c2);
MATCH (f:Foo)<--() RETURN f, COUNT(*) AS count;
MATCH (f1:Foo)<-[:FOR]-()-[:NEXT]->()-[:FOR]->(f2:Foo)
RETURN f1, f2, COUNT(*) AS count;
MATCH (f1:Foo)<-[:FOR]-()-[:NEXT]->(b1)-[:FOR]->(f2:Foo), (b1)-[:NEXT]->(b2)-[:FOR]->(f3:Foo)
RETURN f1, f2, f3, COUNT(*) as count;
以下是上一个查询的结果,该查询显示了所有7个有效三元组及其出现的次数:
+----------------------------------------------------------------------+
| f1 | f2 | f3 | count |
+----------------------------------------------------------------------+
| Node[3]{name:"D"} | Node[4]{name:"E"} | Node[1]{name:"B"} | 1 |
| Node[1]{name:"B"} | Node[3]{name:"D"} | Node[4]{name:"E"} | 1 |
| Node[4]{name:"E"} | Node[1]{name:"B"} | Node[2]{name:"C"} | 1 |
| Node[3]{name:"D"} | Node[0]{name:"A"} | Node[1]{name:"B"} | 1 |
| Node[1]{name:"B"} | Node[3]{name:"D"} | Node[0]{name:"A"} | 1 |
| Node[0]{name:"A"} | Node[1]{name:"B"} | Node[3]{name:"D"} | 1 |
| Node[0]{name:"A"} | Node[1]{name:"B"} | Node[2]{name:"C"} | 1 |
+----------------------------------------------------------------------+