2016-07-11 10 views
2

Knoten, die in neo4j zurückgegeben werden, scheinen etwas Besonderes zu sein, da sie als JSON-Objekte ausgegeben werden, und sie erscheinen überhaupt nicht, wenn sie null sind.Gibt es eine Möglichkeit, von einem Knoten zurückgegebene Eigenschaften in die Whitelist oder Blacklist aufzunehmen?

Ein Beispiel: Ich habe ein: Person-Objekt, und sie können 0 oder mehr haben: Freund Beziehungen zu einem anderen: Person.

Nehmen wir an, dass a: Person folgende Eigenschaften hat: ID, firstName, lastName, sensitiveThing.

sensitiveThing ist eine Eigenschaft, die von unserem System verwendet werden kann oder für den Benutzer selbst zugänglich sein könnte, aber wir möchten sie nicht an andere Benutzer zurückgeben.

Wenn ich eine Abfrage wollen Daten meiner Freunde mir zurück, und Freunde dieser Freunde, möchte ich eine Abfrage wie diese

MATCH (me:User{ID:777})-[:Friend]-(friend:User) 
WITH me, friend 
OPTIONAL MATCH (friend)-[:Friend]-(foaf:User) 
WHERE me <> foaf 
RETURN friend.ID, friend.firstName, friend.lastName, COLLECT(foaf) AS FriendOfAFriend 

verwenden Während dies lässt mich schön Freunde von Freunden als JSON bündeln Objekte innerhalb eines JSON-Arrays und gibt korrekt ein leeres Array aus, wenn ein Freund neben mir keine anderen Freunde hat, ich möchte mit dieser Abfrage nicht sensitiveThing zurückgeben.

Wenn ich versuche, COLLECT (FOAF) mit einem benutzerdefinierten Objekt nur Felder mich interessiert, einschließlich zu ersetzen, wie folgt aus:

COLLECT({ID:(foaf.ID), firstName:(foaf.firstName), lastName:(foaf.lastName)}) 

dann bekomme ich, was ich ... will, bis ich den Fall treffen, wo es sind keine Freunde von Freunden. Wenn ich zuvor mit Knoten gearbeitet habe, wurde das Objekt nicht einmal ausgegeben. Aber jetzt würde ich etwas wie das zu mir zurückgegeben bekommen:

[{ID: (null), firstName: (null), lastName: (null)}] 

Das ist offensichtlich nicht das, was ich will.

Idealerweise suche ich nach einer Möglichkeit, einen Knoten wie zuvor zurückzugeben, aber Whitelist- oder Blacklist-Eigenschaften, die ich ausgeben möchte, damit ich die korrekte Nullbehandlung beibehalten kann, wenn der Knoten null ist (aus einer optionalen Übereinstimmung)

Wenn ich das nicht haben kann, dann möchte ich eine Möglichkeit, ein benutzerdefiniertes Objekt zu verwenden, aber das Objekt überhaupt nicht zurückgeben, wenn alle seine Felder null sind.

Alle anderen Problemumgehungen oder Tipps für den Umgang mit optionalen Übereinstimmungen sind mehr als willkommen.

Antwort

1

Ich habe noch nie einen Weg zur Whitelist oder Blacklist Eigenschaften in der Dokumentation gesehen.

Allerdings können Sie Ihr benutzerdefiniertes Objekt zurückgeben durch collect mit extract Verkettungs:

MATCH (me:User{ID:777})-[:Friend]-(friend:User) 
WITH me, friend 
OPTIONAL MATCH (friend)-[:Friend]-(foaf:User) 
WHERE me <> foaf 
WITH friend, collect(foaf) AS FriendOfAFriend 
RETURN friend.ID, friend.firstName, friend.lastName, 
     extract(foaf in FriendOfAFriend | {ID:(foaf.ID), firstName:(foaf.firstName), lastName:(foaf.lastName)}) AS FriendOfAFriend 

collect wird eine leere Liste zurück, wenn es keine Freunde sind, wird extract hält es so.

+0

Genau das, was ich suchte, danke! Das ist eines der Dinge, die ich in der Dokumentation nicht gelernt habe. – InverseFalcon

1

können Sie verwenden apoc.map.removeKeys:

WITH {p1: 1, p2: 2, p3: 3, p4: 4} as node 
CALL apoc.map.removeKeys(node, ['p2', 'p4']) YIELD value 
RETURN value