Neo4J - Set/Create new label on relationship based on property - neo4j

I'd like to set a different style/color for relationships in my database that have the property "critical". I assume to do this, I need to update the relationships with a new label called "isCrit" and modify the grass file.
Can anyone help with selecting all relationships with a particular property and create the new label "isCrit"?
Fairly new to neo4j

Can anyone help with selecting all relationships with a particular
property and create the new label "isCrit"?
Neo4j relationships do not have labels. Labels are part of nodes. They can hold more than one label. Relationships have a relationship type. Take a look in the docs about relationships.
Also, relationships can have only one type. This way you cannot add another relationship type to a given relationship. Moreover, currently has no way to change the relationship type. In the cases that you want to change the relationship type you should delete the current relationship and create a new one with the desired type, as described in this answer:
MATCH (n:User {name:"foo"})-[r:REL]->(m:User {name:"bar"})
CREATE (n)-[r2:NEWREL]->(m)
// copy properties, if necessary
SET r2 = r
WITH r
DELETE r

Related

Why need to restrict data inserts that do not specify edge types?

neo4j#neo4j> create (v:player)-[]->();
Exactly one relationship type must be specified for CREATE. Did you forget to prefix your relationship type with a ':'? (line 2, column 18 (offset: 18))
"create (v:player)-[]->();"
I think this is also useful for queries like MATCH p=(v:player)-[]->() RETURN p, so why limit it?
Actually, WHEN I was watching cypher, I was a little confused about why to proposed the concept of relationship type instead of the concept of Edge label.
Can someone help me with this problem?
Relationship type and edge label are identical concepts. Each relationship needs exactly a single type or label to be defined when you import the graph. You can always use a generic edge label like RELATIONSHIP if you don't have a specific edge label in mind.
create (v:player)-[:RELATIONSHIP]->(:player);
This is how the property graph model is defined in Neo4j. However, you can always match relationships and disregard the relationship type as in your example:
MATCH p=(v:player)-[]->() RETURN p
For more details on modelling relationships in Neo4j, check the following blog post: https://medium.com/neo4j/graph-data-modeling-all-about-relationships-5060e46820ce

How could i use this SQL on cypher(neo4j)

hi how can i transform this SQL Query as CYPHER Query ? :
SELECT n.enginetype, n.Rocket20, n.Yearlong, n.DistanceOn,
FROM TIMETAB AS n
JOIN PLANEAIR AS p ON (n.tailnum = p.tailNum)
If it is requisition before using that query to create any relationship or antyhing please write and help with that one too.. thanks
Here's a good guide for comparing SQL with Cypher and showing the equivalent Cypher for some SQL queries.
If we were to translate this directly, we'd use :PLANEAIR and :TIMETAB node labels (though I'd recommend using better names for these), and we'll need a relationship between them. Let's call it :RELATION.
Joins in SQL tend to be replaced with relationships between nodes, so we'll need to create these patterns in your graph:
(:PLANEAIR)-[:RELATION]->(:TIMETAB)
There are several ways to get your data into the graph, usually through LOAD CSV. The general approach is to MERGE your :PLANEAIR and :TIMETAB nodes with some id or unique property (maybe TailNum?, use ON CREATE SET ... after the MERGE to add the rest of the properties to the node when it's created, and then MERGE the relationship between the nodes.
The MERGE section of the developers manual should be helpful here, though I'd recommend reading through the entire dev manual anyway.
With this in place, the Cypher equivalent query is:
MATCH (p:PLANEAIR)-[:RELATION]->(n:TIMETAB)
RETURN n.Rocket20,p.enginetype, n.year, n.distance
Now this is just a literal translation of your SQL query. You may want to reconsider your model, however, as I'm not sure how much value there is in keeping time-related data for a plane separate from its node. You may just want to have all of the :TIMETAB properties on the :PLANEAIR node and do away with the :TIMETAB nodes completely. Of course your queries and use cases should guide how to model that data best.
EDIT
As far as creating the relationship between :PLANEAIR and :TIMETAB nodes (and again, I recommend using better labels for these, and maybe even keeping all time-related properties on a :Plane node instead of a separate one), provided you already have those nodes created, you'll need to do a joining match, but it will help to have a unique constraints on :PLANEAIR(tailnum) :TIMETAB(tailNum) (or an index, if this isn't supposed to be a unique property):
CREATE CONSTRAINT ON (p:PLANEAIR)
ASSERT p.tailNum IS UNIQUE
CREATE CONSTRAINT ON (n:TIMETAB)
ASSERT n.TailNum IS UNIQUE
Now we're ready to create the relationships
MATCH (p:PLANEAIR)
MATCH (n:TIMETAB)
WHERE p.tailNum = n.tailNum
CREATE (p)-[:RELATION]->(n)
REMOVE n.tailNum
Now that the relationships are created, and :TIMETAB tailNum property removed, we can drop the unique constraint on :TIMETAB(tailNum), since the relationship to :PLANEAIR is all we need.
DROP CONSTRAINT ON (n:TIMETAB)
ASSERT n.tailNum IS UNIQUE

How do you link two nodes together as parent child in neo4j

I have a set of nodes which are part of a hierarchy. One node can be related to other node by virtue of child having a parentKey which links to another node. In relational land this would be represented as a 'pigs ear' in an ER diagram.
How can I can generate this relationship between the nodes in neo4j?
I'm quite new to graphs so apologies if I haven't explain it very well.
Thanks
If I understand you correctly, you want to link a "child" node to a "parent" node. That is very easy to do. For instance:
CREATE (child:Person)-[:HAS_PARENT]->(parent:Person)
In this sample data model, we have a Person node label, and a HAS_PARENT relationship type. HAS_PARENT relationships are used to link Person nodes to represent the hierarchy.
If you're talking about already existing nodes, you can match the existing nodes and then use merge to create a relationship.
MATCH (child:SomeLabel) MATCH (parent:SomeOtherLabel)
MERGE (parent)-[:HAS_CHILD]->(child)
You can also use merge when creating new nodes.
See http://neo4j.com/docs/stable/query-merge.html

How to retrieve a specific relationship by one of its properties in Cypher? (neo4j)

I am trying to come up with the Cypher syntax to both:
Create an index on a relationship property
Query that index in order to retrieve an specific relationship from one of its values.
Since labels cannot be used for relationships, how could it be done?
Unfortunately, you can't add index to relationships in Neo4j. So, you ca't query database for specific relationship by it's property value.
There are alternatives.
Data model
You can reorganize data in such way that:
Specific properties are in nodes
Create specific relationship types
Usually you can design that in a way when properties that are needed for queries are in nodes, and only additional properties (i.e. cost) are in relationship.
Anyway you can query relationship by specific property:
MATCH (start)-[:RELATIONSHIP {property: "value"}]->(end)
This will end up in fullscan of :RELATIONSHIP scope.
If you know start/end node id's
If you know id's for start and end nodes, and want to update property for specific relationship, then this one should work:
MATCH (start)-[r:RELTYPE {property: "value"}]->(end)
WHERE id(start) = 1 AND id(end) = 2
WITH r
SET r.property = "new_value"
RETURN r
Legacy index
Warning: this functionality is deprecated. I believe that it will be removed in Neo4j 3.0.0.
But there is - Relationship indexes. You can checkout what it provides and if this functionality can be used in your app.

how to create unique relationships neo4j 2.0

I am trying to create some unique relationships between entities in neo4j. Right now I have authors and articles, with a Authored relationship between them. I want to create a CoAuthored relationship between the entities
Like so
match (a)-[r]->(b)<-[r2]-(c)
create (a)-[new:CoAuthor]->(c)
However, I would like to create a unique co-author relationship, but update the weight if it already exists. I saw this postm but the syntax is no longer supported In Cypher, how can I create a relationship if it doesn't exist; update property if it does
SyntaxException: This syntax is no longer supported (missing properties are now returned as null). Please use (not(has(<ident>.weight)) OR <ident>.weight=<value>) if you really need the old behavior.
I do not quite understand what it is that I am replacing. I looked at the Merge command, but can't quite get it to work
You should be able to replace create with merge in this particular case.
match (a)-[r]->(b)<-[r2]-(c)
merge (a)-[new:CoAuthor]->(c)
on create set new.weight=1
on match set new.weight=new.weight+1

Resources