Neo4j:查询具有指定关系的所有路径
我试图查询一个图,以返回具有指定关系的所有路径 我正在构建一个族谱,我有以下节点:Neo4j:查询具有指定关系的所有路径,neo4j,cypher,Neo4j,Cypher,我试图查询一个图,以返回具有指定关系的所有路径 我正在构建一个族谱,我有以下节点: 人 边缘 连接两个人的关系包括: 母公司 孩子 夫妻 因此,一些数据的示例如下: a:人B:人 例如:这个人 在我的查询中,我希望能够在我的前端绘制图形,因此我需要获得每个人和边缘节点,以及它们之间的每个关系,这些关系连接到我的起始人 我最初尝试使用AllShortestPath来减少节点的重复,但这会丢失很多关系(例如,如果父母有多个子女,则只会返回与子女的母亲或父亲关系,而不会同时返回两者)。我当前的密码如下
CREATE (p1:Person)<-[:CHILD]-(r1:Edge { type:'parentChild' })-[:PARENT]->(p2:Person)
<-[:COUPLE]-(r2:Edge { type:'couple' })-[:COUPLE]->(p3:Person)<-[:PARENT]-
(r3:Edge { type:'parentChild' })-[:CHILD]->p1<-[:COUPLE]-(r4:Edge { type:'couple' })-[:COUPLE]->
(p4:Person)<-[:CHILD]-(r5:Edge { type:'parentChild' })-[:PARENT]->(p5:Person)<-[:COUPLE]-
(r6:Edge { type:'couple' })-[:COUPLE]->(p6:Person)<-[:PARENT]-(r7:Edge { type:'parentChild' })-
[:CHILD]->p4,
p5<-[:PARENT]-(r8:Edge { type:'parentChild' })-[:CHILD]->(p7:Person),
p5<-[:PARENT]-(r9:Edge { type:'parentChild' })-[:CHILD]->(p8:Person),
p5<-[:PARENT]-(r10:Edge { type:'parentChild' })-[:CHILD]->(p9:Person)
CREATE(p1:Person)(p2:Person)
(p3:人)p1
(p4:人)(p5:人)(p6:人)p4,
p5(第7页:个人),
p5(第8页:个人),
p5(第9页:个人)
此图显示了数据的视图
所需的结果是每个节点边缘节点连接对应一行。这个数据总共有10行,但由于循环的原因,当我返回所有路径时,我得到了128行。有没有更有效的过滤路径的方法?为了解决这个问题,我使用了以下密码
START person = node({personId})' +
MATCH person-[:PARENT | CHILD | COUPLE*0..]-(p:Person)
WITH distinct p
MATCH p-[r]-(edge:Edge), p-[:NAME]->(name), p-[:GENDER]->gender, edge-[:FACT]->(fact)
RETURN p, id(p), collect(name), gender, type(r), id(edge), collect(fact.type)
ORDER BY id(edge)
我曾经在关系中使用*0..来匹配所有已连接的“Person”节点,包括原始节点。删除重复项后,只需查找节点之间的所有关系和每个点上的额外信息
这个密码为每个“人”到“边缘”关系返回一行。“个人”信息中存在一些重复,但一旦返回数据,就很容易解析出来
感谢您的评论和帮助。如果只进行路径匹配而没有最短路径,会发生什么?你能用聚合或分离来限制复制吗?Michael-谢谢你的回复,但我不知道如何减少返回路径的数量。我添加了更多的细节,希望能更详细地解释这个问题。感谢您的帮助。您是否考虑过使用事务性rest资源并请求
“resultdatacontents”:“graph”
?我不知道您需要返回什么来正确地可视化数据,但您可以尝试匹配您的模式,将所有不同的关系提取并收集为一个结果行,按“图形”请求,并且结果应该是非冗余的,并且易于解析以供可视化。
START person = node({personId})' +
MATCH person-[:PARENT | CHILD | COUPLE*0..]-(p:Person)
WITH distinct p
MATCH p-[r]-(edge:Edge), p-[:NAME]->(name), p-[:GENDER]->gender, edge-[:FACT]->(fact)
RETURN p, id(p), collect(name), gender, type(r), id(edge), collect(fact.type)
ORDER BY id(edge)