2015-10-01 30 views
0

可有什麼不對這個暗號查詢的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 

它返回空值王牌即使在圖形數據庫提供多個節點的節點。 但有些時候,如果數據庫中有4個ace節點,它會返回像4行一樣的適當值。 代碼我寫的關於春天的安全ACL 參考鏈接: https://github.com/shazin/spring-security-acl-neo4j/blob/master/src/main/java/org/springframework/security/acls/neo4j/Neo4jLookupStrategy.java

請提出修改意見。

回答

0

您的問題來自OPTIONAL MATCH,根據Neo4j's documentationOPTIONAL MATCH返回NULL如果屬性或元素未找到。

因爲這個,你會得到NULL值。如果您的acl節點沒有與他相關的任何ace節點,則該節點將替換爲NULL

0

您在可選匹配中綁定ace節點。當該可選匹配未能匹配時,ace將爲空。

如果您認爲可選匹配應該成功,否則可以提供示例。這樣做的一個好方法是在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 ... 
相關問題