Cypher查询返回空值,即使该模式在数据库中可用



这个密码查询有问题吗

MATCH (owner:SidNode)<-[:OWNED_BY]-(acl:AclNode)-[:SECURES]->(class:ClassNode) 
OPTIONAL MATCH (acl)<-[:COMPOSES]-(ace:AceNode)-[:AUTHORIZES]->(sid:SidNode) 
WITH acl, ace, owner, sid, class 
    WHERE  (acl.objectIdIdentity = {objectIdIdentity1} AND class.className = {className1})   
RETURN 
owner.principal AS aclPrincipal, 
owner.sid AS aclSid, 
acl.objectIdIdentity AS objectIdIdentity, 
ace.aceOrder AS aceOrder, 
ID(acl) AS aclId, 
acl.parentObject AS parentObject, 
acl.entriesInheriting AS entriesInheriting, 
ID(ace) AS aceId, ace.mask AS mask, 
ace.granting AS granting, 
ace.auditSuccess AS auditSuccess, 
ace.auditFailure AS auditFailure, 
sid.principal AS acePrincipal, 
sid.sid AS aceSid, 
class.className AS className  
ORDER BY acl.objectIdIdentity ASC, ace.aceOrder ASC

对于ace节点返回空值,即使在图数据库中有多个可用节点。但有时它返回正确的值,如4行,如果有4个ace节点在db。我写的代码是关于spring安全acl参考链接:https://github.com/shazin/spring-security-acl-neo4j/blob/master/src/main/java/org/springframework/security/acls/neo4j/Neo4jLookupStrategy.java

请提出修改建议

您的问题来自OPTIONAL MATCH,根据Neo4j的文档,如果没有找到属性或元素,OPTIONAL MATCH返回NULL

因此您将获得NULL值。如果您的acl节点没有任何与之相关的ace节点,则该节点将被NULL

替换。

在可选匹配中绑定ace节点。当可选的匹配失败时,ace将为null。

如果您认为可选匹配应该在不成功的情况下成功,也许您可以提供一个示例。这样做的一个好方法是在http://console.neo4j.org

创建一个小示例图。

你的WHERE条款中的条件看起来像它们属于你的MATCH条款。您可能希望将WHERE子句向上移动,然后可以完全删除WITH。它不会影响空值,但它会使您的查询更有效,更可读。(另外,您不需要在WHERE子句中使用括号。)

MATCH (owner:SidNode)<-[:OWNED_BY]-(acl:AclNode)-[:SECURES]->(class:ClassNode)
WHERE acl.objectIdIdentity = {objectIdIdentity1} AND class.className = {className1}
OPTIONAL MATCH (acl)<-[:COMPOSES]-(ace:AceNode)-[:AUTHORIZES]->(sid:SidNode)
RETURN ...

最新更新