在我解释我面临的问题之前,我认为如果我稍微解释一下我的图形数据库的结构会更好。以下是我的neo4j
图数据库中的节点,关系和属性:
在我真正提出我的问题之前,我想说明我对neo4j技术很陌生,所以我确实理解我的问题的解决方案可能是基本的。
我想获得两个用户之间的所有最短路径,然后为我希望得到的路径中的这两个用户之间的每个节点:
我可以使用以下cypher查询获取路径:
match (u1: User {uid: '0001'}),
(u2: User{uid: '0002'}),
paths = allShortestPaths((u1)-[*..4]-(u2))
return paths
获取路径后,如果我按以下方式修改上述查询,我可以使用extract
,nodes
,relationships
函数获取节点的属性,路径中的关系:< / p>
match (u1: User {uid: '0001'}),
(u2: User{uid: '0002'}),
paths= allShortestPaths((u1)-[*..4]-(u2))
with extract(n in nodes(paths) | [n.name]) as nds,
extract(r in relationships(paths)| [type(r)]) as rels
return nds,rels
但我真正希望得到的是email
和phone
属性关闭Email
和Phone
个节点,它们连接到给定路径中的任何节点。
我已经浏览了official documentation和很多博客帖子,但找不到任何解决方案或类似的问题。
如何实现上述目标?
PS:我想在一次查询中实现这一目标
由于
答案 0 :(得分:3)
这样的事情是否满足您的需求?
主要编辑如下:
在下面的回复声明中:
这是密码:
// match the user nodes and the shortest intermediate paths between them
match (u1:User {uid: '0001'})
, (u2:User {uid: '0002'})
, path = allShortestPaths((u1)-[*..4]-(u2))
// filter out the intermediate user nodes into one collection
with filter(n IN nodes(path)[1..length(nodes(path))-1]
where any(x in labels(n) where x = 'User'))
as intermediate_users
// filter out the intermediate book titles into another collection
, [n IN nodes(path)[1..length(nodes(path))-1]
where any(x in labels(n) where x in ['Book','BlogPost'])
| n.title ]
as intermediate_books_posts
// iterate through the intermediate user nodes
// and optionally match email and phone nodes
unwind intermediate_users as u
optional match (e:Email)<--u-->(p:Phone)
return u.name, e.address, p.number, intermediate_books_posts