Neo4j 密码查询:具有指定节点和关系属性的 AllShortestPaths
Neo4j cypher query: AllShortestPaths with specified nodes and relationship properties
我是 neo4j 的新手。
我创建了这个例子:
// (Node2)
// / \
// Rel2 / \ Rel3
// / \
// (Node1) ------> (Node3)
// Rel1
//
// create nodes
CREATE
(n1:Node1{id:1,rights:["admin","user"]}),
(n2:Node2{id:2,rights:["admin","user"]}),
(n3:Node3{id:3,rights:["admin","user"]})
// create relationships
CREATE (n1)-[r1:Rel1{id:11,rights:["admin"]}]->(n3)
CREATE (n1)-[r2:Rel2{id:12,rights:["admin","user"]}]->(n2)
CREATE (n2)-[r3:Rel3{id:13,rights:["admin","user"]}]->(n3)
RETURN n1,n2,n3,r1,r2,r3
每个节点和关系都有一个包含一些权限值的 属性 数组。
我想创建一个查询,为我提供具有指定属性的两个节点之间的(最短)路径。
示例:
用户有权限'admin',路径应该是:
(节点 1)-[Rel1]->(节点 3)
(每个节点和关系在 'rights' 属性 中都有 'admin' 字符串。)
如果用户有权限'user',路径应该是:
(Node1)-[Rel2]-(Node2)-[Rel3]-(Node3)
(因为 Rel1 关系在 'rights' 属性 中没有 'user' 字符串。)
起初我尝试了这个有效的查询:
WITH ["admin","otherRight"] AS usersRights
MATCH path=allShortestPaths((n1:Node1{id:1})-[*..4]-(n2:Node3{id:3}))
WITH *, relationships(path) AS rels, nodes(path) as nodes
WHERE ANY (rel IN rels WHERE ANY(r IN rel.rights WHERE r IN usersRights))
AND ANY (node IN nodes WHERE ANY(r IN node.rights WHERE r IN usersRights))
RETURN path
然后我将 'admin' 替换为 'user',但此查询无效(没有结果):
WITH ["user","otherRight"] AS usersRights
MATCH ... // same as above
...
RETURN path
以下查询符合我需要的结果,但在这种情况下,
我将不得不进行多次查询以获得深度 n 的所需结果(最短路径)。
WITH ["user","otherRight"] AS usersRights
MATCH path=(n1:Node1{id:1})-[r1]-(n2)-[r2]-(n3:Node3{id:3})
WHERE ANY(r IN n1.rights WHERE r IN usersRights)
AND ANY(r IN r1.rights WHERE r IN usersRights)
AND ANY(r IN n2.rights WHERE r IN usersRights)
AND ANY(r IN r2.rights WHERE r IN usersRights)
AND ANY(r IN n3.rights WHERE r IN usersRights)
RETURN path
是否可以创建一个密码查询来给出我不满意的结果?
谢谢。
您的第一个查询有一个 WITH
子句分隔 MATCH
和 WHERE
子句,从而防止 WHERE
子句影响 allshortestpath()
功能。因此,该函数只是返回最短路径,而没有测试节点和关系。
试试这个,而不是:
WITH ["admin","otherRight"] AS usersRights
MATCH path=allShortestPaths((n1:Node1{id:1})-[*..4]-(n2:Node3{id:3}))
WHERE
ANY (rel IN relationships(path) WHERE ANY(r IN rel.rights WHERE r IN usersRights)) AND
ANY (node IN nodes(path) WHERE ANY(r IN node.rights WHERE r IN usersRights))
RETURN path;
我是 neo4j 的新手。
我创建了这个例子:
// (Node2)
// / \
// Rel2 / \ Rel3
// / \
// (Node1) ------> (Node3)
// Rel1
//
// create nodes
CREATE
(n1:Node1{id:1,rights:["admin","user"]}),
(n2:Node2{id:2,rights:["admin","user"]}),
(n3:Node3{id:3,rights:["admin","user"]})
// create relationships
CREATE (n1)-[r1:Rel1{id:11,rights:["admin"]}]->(n3)
CREATE (n1)-[r2:Rel2{id:12,rights:["admin","user"]}]->(n2)
CREATE (n2)-[r3:Rel3{id:13,rights:["admin","user"]}]->(n3)
RETURN n1,n2,n3,r1,r2,r3
每个节点和关系都有一个包含一些权限值的 属性 数组。 我想创建一个查询,为我提供具有指定属性的两个节点之间的(最短)路径。 示例:
用户有权限'admin',路径应该是:
(节点 1)-[Rel1]->(节点 3)
(每个节点和关系在 'rights' 属性 中都有 'admin' 字符串。)
如果用户有权限'user',路径应该是:
(Node1)-[Rel2]-(Node2)-[Rel3]-(Node3)
(因为 Rel1 关系在 'rights' 属性 中没有 'user' 字符串。)
起初我尝试了这个有效的查询:
WITH ["admin","otherRight"] AS usersRights
MATCH path=allShortestPaths((n1:Node1{id:1})-[*..4]-(n2:Node3{id:3}))
WITH *, relationships(path) AS rels, nodes(path) as nodes
WHERE ANY (rel IN rels WHERE ANY(r IN rel.rights WHERE r IN usersRights))
AND ANY (node IN nodes WHERE ANY(r IN node.rights WHERE r IN usersRights))
RETURN path
然后我将 'admin' 替换为 'user',但此查询无效(没有结果):
WITH ["user","otherRight"] AS usersRights
MATCH ... // same as above
...
RETURN path
以下查询符合我需要的结果,但在这种情况下, 我将不得不进行多次查询以获得深度 n 的所需结果(最短路径)。
WITH ["user","otherRight"] AS usersRights
MATCH path=(n1:Node1{id:1})-[r1]-(n2)-[r2]-(n3:Node3{id:3})
WHERE ANY(r IN n1.rights WHERE r IN usersRights)
AND ANY(r IN r1.rights WHERE r IN usersRights)
AND ANY(r IN n2.rights WHERE r IN usersRights)
AND ANY(r IN r2.rights WHERE r IN usersRights)
AND ANY(r IN n3.rights WHERE r IN usersRights)
RETURN path
是否可以创建一个密码查询来给出我不满意的结果?
谢谢。
您的第一个查询有一个 WITH
子句分隔 MATCH
和 WHERE
子句,从而防止 WHERE
子句影响 allshortestpath()
功能。因此,该函数只是返回最短路径,而没有测试节点和关系。
试试这个,而不是:
WITH ["admin","otherRight"] AS usersRights
MATCH path=allShortestPaths((n1:Node1{id:1})-[*..4]-(n2:Node3{id:3}))
WHERE
ANY (rel IN relationships(path) WHERE ANY(r IN rel.rights WHERE r IN usersRights)) AND
ANY (node IN nodes(path) WHERE ANY(r IN node.rights WHERE r IN usersRights))
RETURN path;