我是Neo4j的新手,正在开发一个小网站。
我已经设置了它们之间的节点和关系。对于大多数配对节点,我创建了一个相互链接。例如:
Zeus - FATHER -> Apollo
Appollo - SON -> Zeus
我使用shortestPath
找到这两者之间可能的最短路径:
MATCH (o1 { name: 'Apollo' }),(o2 { name: 'Zeus' }), p = shortestPath((o1)-[*..6]-(o2)) RETURN nodes(p), relationships(p)
结果是它返回"父亲"而不是" SON"。
如果我将查询更改为[*..6]->(o2)
," SON"退回。
但是我需要考虑搜索可能使o1
节点没有传出关系,在这种情况下,上面修改的查询失败。
所以:
我当然可以将每个节点更改为至少有一个传出关系来修复问题2但这太冗余了。
希望得到你的建议。
答案 0 :(得分:1)
与您一样创建双向关系是一种不好的做法,特别是当它是双射时。
您正在复制数据库中的某些数据(很明显,如果Zeus
是Apollo
的父亲,Apollo
是Zeus
的儿子,
此查询:
MATCH
(o1 { name: 'Apollo' }),
(o2 { name: 'Zeus' }),
p = shortestPath((o1)-[*..6]-(o2))
RETURN nodes(p), relationships(p)
仅搜索一个最短路径。但由于重复,实际上有两个最短路径。您可以使用shortestpath
替换allshortestpaths
功能以查找所有内容。因此,您将获得son
和father
结果。
或者你也可以给shortestpath函数一个关系类型列表,它可以像这样遍历:
MATCH
(o1 { name: 'Apollo' }),
(o2 { name: 'Zeus' }),
p = shortestPath((o1)-[:FATHER*..6]-(o2))
RETURN nodes(p), relationships(p)