Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Map Projection #216

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open

Map Projection #216

wants to merge 2 commits into from

Conversation

thobe
Copy link
Contributor

@thobe thobe commented Apr 13, 2017

@thobe thobe added the CIP label Apr 13, 2017
@thobe
Copy link
Contributor Author

thobe commented Apr 13, 2017

This CIP also takes on #201.

@thobe thobe changed the title CIP2017-02-07 Map Projection Map Projection Apr 13, 2017
Copy link
Member

@Mats-SX Mats-SX left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good start! I'd like to see some more examples, especially on select all selector, using its exclusion feature, and in combination with a conflict to illustrate that semantics.


== Map Projection

Map projection takes a map or entity (node or relationship) and creates a map based on selected properties from map or entity.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

selected properties from the map or ...


Map projection takes a map or entity (node or relationship) and creates a map based on selected properties from map or entity.
The map projection largely reuses the map syntax of curly braces and comma separated entries.
But the projection entries are just a single identifier starting with a dot (.).
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd fuse these sentences, like

separated entries, but the projection entries

or

separated entries, with the exception that the projection entries only use a single identifier

{alpha: someMap.alpha, beta: someMap.beta}
----

In order to be further useful, map projection allow other types of selectors to augment the projected map.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

map projections

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be useful with an example of, or some more discussion around, these other types of selectors.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now I read about selectors further below; perhaps a cross-reference here is enough (e.g. 'read more about these in Selectors').

• *Literal entry* - includes a entry into the projected map using the regular map entry syntax, i.e. with the value being explicitly different from the key.
In this case the value can be any arbitrary expression, just like in a regular map literal.
• *All properties selector* - includes all properties from the original map or entity into the projected map. +
The all properties selector also allows marking properties for exclusion that would otherwise have been included by the selector. +
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The + at the end of the line forces a line break; is this intended. I find that it renders unusefully.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, that is intentional. The second sentence is specific point about all properties selectors. I thought it was worth highlighting that, so I put it on its own line, since I thought a single sub-bullet was too much weight for it.

In this case the value can be any arbitrary expression, just like in a regular map literal.
• *All properties selector* - includes all properties from the original map or entity into the projected map. +
The all properties selector also allows marking properties for exclusion that would otherwise have been included by the selector. +
If any properties explicitly stated in the map projection through another selector type conflicts with a property in the original map, the explicitly stated entry takes precedence and the value from that expression overrides the value from the original map.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this makes sense, but I'd like to record that we could make this kind of conflict an error, effectively forcing users to explicitly exclude conflicting entries. Perhaps that could be a configurable semantics?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a later sentence on cases where you might actually want the overriding behaviour.

[source, cypher]
.Fetch name and address for a person
----
MATCH (person:Person{userId=$user})-[:ADDRESS]->(address)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Syntax error: should be : instead of = in the inlined property predicate.

Cypher style: space between the inlined label predicate and the inlined property predicate.

| person |
+----------------------------------------------------------------------------------------+
| {firstName: "Sherlock", lastName: "Holmes", id: "0099CC", |
| address: {streetAddress: "221B Baker Street", city: "London", postalCode: "NW1 6XE"}} |
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cypher style: single ticks for literal strings.

[source, cypher]
.Bind variables into a map
----
MATCH (group:Group{name:$groupName})<-[:MEMBER_OF]-(member)-[:KNOWS]-(friend)-[:ADDRESS]->(address)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cypher style: space between label and property predicate.
Cypher style: space after : in property predicate.

.Bind variables into a map
----
MATCH (group:Group{name:$groupName})<-[:MEMBER_OF]-(member)-[:KNOWS]-(friend)-[:ADDRESS]->(address)
RETURN member.name, collect( {friend{.name},address{.city}} ) AS friends
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cypher style: no space on insides of the collect() parentheses.
Cypher style: space after comma.

+-------------+---------------------------------------------------------------+
| Eve Longman | • {friend: {name:"Mickey Mouse"}, address:{city:"Orlando"}} |
| | • {friend: {name:"Leroy Jenkins"}, address:{city:"New York"}} |
| | • {friend: {name:"Minnie Mouse"}, address:{city:"Orlando"}} |
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cypher style: single tick for literal string.
Cypher style: space after colons.

@walter-weinmann
Copy link

Is this suposed to be implemented ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants