package Ġstreams . service . sink . strategy Ċ Ċ import Ġstreams . extensions . quote Ċ Ċ enum Ġclass ĠPattern Configuration Type Ġ{ ĠALL , ĠINCLUDE , ĠEX CL UDE Ġ} Ċ Ċ private Ġconst Ġval ĠID _ PREFIX Ġ= Ġ" !" Ċ private Ġconst Ġval ĠMIN US _ PREFIX Ġ= Ġ"-" Ċ private Ġconst Ġval ĠLABEL _ SEPARATOR Ġ= Ġ":" Ċ private Ġconst Ġval ĠPROPER TIES _ SEPARATOR Ġ= Ġ"," Ċ Ċ private Ġfun Ġget Pattern Configured Type ( properties : ĠList < String >): ĠPattern Configuration Type Ġ{ ĊĠĠĠ Ġif Ġ( properties . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPattern Configuration Type . ALL ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġwhen Ġ( properties [ 0 ]. trim ()[ 0 ]) Ġ{ ĊĠĠĠĠĠĠĠ Ġ'*' Ġ-> ĠPattern Configuration Type . ALL ĊĠĠĠĠĠĠĠ Ġ'-' Ġ-> ĠPattern Configuration Type . EXCL UDE ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠPattern Configuration Type . INCLUDE ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġis Hom ogeneous Pattern ( type : ĠPattern Configuration Type , Ġproperties : ĠList < String >, Ġpattern : ĠString , Ġentity Type : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġis Hom ogeneous Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPattern Configuration Type . INCLUDE Ġ-> Ġproperties . all Ġ{ Ġit . trim ()[ 0 ]. is Java Identifier Start () Ġ} ĊĠĠĠĠĠĠĠ ĠPattern Configuration Type . EXCL UDE Ġ-> Ġproperties . all Ġ{ Ġit . trim (). startsWith ( MINUS _ PREFIX ) Ġ} ĊĠĠĠĠĠĠĠ ĠPattern Configuration Type . ALL Ġ-> Ġproperties . isEmpty () Ġ|| Ġproperties Ġ== ĠlistOf ("* ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ(! is Hom ogeneous ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" The Ġ$ entity Type Ġpattern Ġ$ pattern Ġis Ġnot Ġhom ogeneous ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġclean Properties ( type : ĠPattern Configuration Type , Ġproperties : ĠList < String >): ĠList < String > Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPattern Configuration Type . INCLUDE Ġ-> Ġproperties . map Ġ{ Ġit . trim () Ġ} ĊĠĠĠĠĠĠĠ ĠPattern Configuration Type . EXCL UDE Ġ-> Ġproperties . map Ġ{ Ġit . trim (). replace ( MINUS _ PREFIX , Ġ"") Ġ} ĊĠĠĠĠĠĠĠ ĠPattern Configuration Type . ALL Ġ-> Ġempty List () ĊĠĠĠ Ġ} Ċ } Ċ Ċ interface ĠPattern Configuration Ċ Ċ data Ġclass ĠNode Pattern Configuration ( val Ġkeys : ĠSet < String >, Ġval Ġtype : ĠPattern Configuration Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabels : ĠList < String >, Ġval Ġproperties : ĠList < String >): ĠPattern Configuration Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġ(: Label A { ! id , foo , bar }) ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġprivate Ġval Ġcy pher Node Pattern Configured Ġ= Ġ""" \ (( :\ w +\ s *( ? :: \ s *( ?:\ w +)\ s *) *) \ s *( ?:\ {\ s * (- ? [\ w ! \. ]+ \ s *( ?: ,\ s *- ?[ !\ w \* \. ]+ \ s *) *) \ }) ?\ )$ """. to Regex () ĊĠĠĠĠĠĠĠ Ġ// ĠLabel A { ! id , foo , bar } ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġprivate Ġval Ġsimple Node Pattern Configured Ġ= Ġ""" ^ (\ w +\ s *( ? :: \ s *( ?:\ w +)\ s *) *) \ s *( ?:\ {\ s * (- ? [\ w ! \. ]+ \ s *( ?: ,\ s *- ?[ !\ w \* \. ]+ \ s *) *) \ }) ?$ """. to Regex () ĊĠĠĠĠĠĠĠ Ġfun Ġparse ( pattern : ĠString ): ĠNode Pattern Configuration Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Cy pher Pattern Ġ= Ġpattern . startsWith (" (" ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġregex Ġ= Ġif Ġ( is Cy pher Pattern ) Ġcy pher Node Pattern Configured Ġelse Ġsimple Node Pattern Configured ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= Ġregex . match Ent ire ( pattern ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matcher Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" The ĠNode Ġpattern Ġ$ pattern Ġis Ġinvalid ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabels Ġ= Ġmatcher . group Values [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. split ( LABEL _ SEPARATOR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Cy pher Pattern ) Ġit . drop ( 1 ) Ġelse Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . quote () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Properties Ġ= Ġmatcher . group Values [ 2 ]. split ( PROPERTIES _ SEPARATOR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġall Properties ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . startsWith ( ID _ PREFIX ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . trim (). substring ( 1 ) Ġ}. toSet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( keys . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" The ĠNode Ġpattern Ġ$ pattern Ġmust Ġcontains Ġat Ġle st Ġone Ġkey ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= Ġall Properties . filter Ġ{ Ġ! it . startsWith ( ID _ PREFIX ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġget Pattern Configured Type ( properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Hom ogeneous Pattern ( type , Ġproperties , Ġpattern , Ġ" Node ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcleaned Properties Ġ= Ġclean Properties ( type , Ġproperties ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNode Pattern Configuration ( keys Ġ= Ġkeys , Ġtype Ġ= Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabels Ġ= Ġlabels , Ġproperties Ġ= Ġcleaned Properties ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ data Ġclass ĠRelationship Pattern Configuration ( val Ġstart : ĠNode Pattern Configuration , Ġval Ġend : ĠNode Pattern Configuration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrel Type : ĠString , Ġval Ġtype : ĠPattern Configuration Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperties : ĠList < String >): ĠPattern Configuration Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġdon 't Ġallow ĠALL Ġfor Ġstart / end Ġnodes Ġin Ġrel s ĊĠĠĠĠĠĠĠ Ġ// Ġit 's Ġpublic Ġfor Ġtesting Ġpurpose ĊĠĠĠĠĠĠĠ Ġfun ĠgetNode Conf ( pattern : ĠString ): ĠNode Pattern Configuration Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠNode Pattern Configuration . parse ( pattern ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( start . type Ġ== ĠPattern Configuration Type . ALL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNode Pattern Configuration ( keys Ġ= Ġstart . keys , Ġtype Ġ= ĠPattern Configuration Type . INCLUDE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabels Ġ= Ġstart . labels , Ġproperties Ġ= Ġstart . properties ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ(: Source { ! id }) - [: REL _ TYPE { foo , Ġ- bar } ]-> (: Target { ! target Id }) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcy pher Relationship Pattern Configured Ġ= Ġ""" ^\ ( :( .*? )\ )( < )? -\ [( ? :: ) ([\ w \_ ]+ )( \ {\ s * (- ? [\ w \* \. ]+ \ s *( ?: ,\ s *- ? [\ w \* \. ]+ \ s *) *) \ }) ?\ ] -( >) ?\ ( :( .*? )\ )$ """. to Regex () ĊĠĠĠĠĠĠĠ Ġ// ĠLabel A { ! id } ĠREL _ TYPE { foo , Ġ- bar } ĠLabel B { ! target Id } ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsimple Relationship Pattern Configured Ġ= Ġ Ġ""" ^ (.* ?) Ġ([ \ w \_ ]+ )( \ {\ s * (- ? [\ w \* \. ]+ \ s *( ?: ,\ s *- ? [\ w \* \. ]+ \ s *) *) \ }) ? Ġ( .*? )$ """. to Regex () Ġ// Ġ""" ^\ (( .*? )\ )- \ [( ? :: ) ([\ w \_ ]+ )( \ {\ s * (- ? [\ w \* \. ]+ \ s *( ?: ,\ s *- ? [\ w \* \. ]+ \ s *) *) \ }) ?\ ]-> \ (( .*? )\ )$ """. to Regex () ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠRelationship Pattern MetaData ( val Ġstart Pattern : ĠString , Ġval Ġend Pattern : ĠString , Ġval Ġrel Type : ĠString , Ġval Ġproperties : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġto Properties ( prop Group : ĠString ): ĠList < String > Ġ= Ġif Ġ( prop Group . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprop Group . split ( PROPERTIES _ SEPARATOR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġcreate ( is Cy pher Pattern : ĠBoolean , Ġis Left To Right : ĠBoolean , Ġgroup Values : ĠList < String >): ĠRelationship Pattern MetaData Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġstart : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġend : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġrel Type : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġprops : ĠList < String > ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Cy pher Pattern ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Left To Right ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġgroup Values [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġgroup Values [ 7 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġgroup Values [ 7 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġgroup Values [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrel Type Ġ= Ġgroup Values [ 3 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprops Ġ= Ġto Properties ( group Values [ 5 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Left To Right ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġgroup Values [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġgroup Values [ 5 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġgroup Values [ 5 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġgroup Values [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrel Type Ġ= Ġgroup Values [ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprops Ġ= Ġto Properties ( group Values [ 4 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRelationship Pattern MetaData ( start Pattern Ġ= Ġstart , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Pattern Ġ= Ġend , Ġrel Type Ġ= Ġrel Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperties Ġ= Ġprops ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġparse ( pattern : ĠString ): ĠRelationship Pattern Configuration Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Cy pher Pattern Ġ= Ġpattern . startsWith (" (" ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġregex Ġ= Ġif Ġ( is Cy pher Pattern ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcy pher Relationship Pattern Configured ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsimple Relationship Pattern Configured ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= Ġregex . match Ent ire ( pattern ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matcher Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" The ĠRelationship Ġpattern Ġ$ pattern Ġis Ġinvalid ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Left To Right Ġ= Ġ(! is Cy pher Pattern Ġ|| Ġis Un directed ( matcher ) Ġ|| Ġis Direct ed To Right ( matcher )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Right To Left Ġ= Ġif Ġ( is Cy pher Pattern ) Ġis Direct ed To Left ( matcher ) Ġelse Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Left To Right Ġ&& Ġ! is Right To Left ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" The ĠRelationship Ġpattern Ġ$ pattern Ġhas Ġan Ġinvalid Ġdirection ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= ĠRelationship Pattern MetaData . create ( is Cy pher Pattern , Ġis Left To Right , Ġmatcher . group Values ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetNode Conf ( metadata . start Pattern ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" The ĠRelationship Ġpattern Ġ$ pattern Ġis Ġinvalid ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetNode Conf ( metadata . end Pattern ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" The ĠRelationship Ġpattern Ġ$ pattern Ġis Ġinvalid ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġget Pattern Configured Type ( metadata . properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Hom ogeneous Pattern ( type , Ġmetadata . properties , Ġpattern , Ġ" Relationship ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcleaned Properties Ġ= Ġclean Properties ( type , Ġmetadata . properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRelationship Pattern Configuration ( start Ġ= Ġstart , Ġend Ġ= Ġend , Ġrel Type Ġ= Ġmetadata . rel Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperties Ġ= Ġcleaned Properties , Ġtype Ġ= Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġis Direct ed To Left ( matcher : ĠMatch Result ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( matcher . group Values [ 2 ] Ġ== Ġ"< " Ġ&& Ġmatcher . group Values [ 6 ] Ġ== Ġ"") ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġis Direct ed To Right ( matcher : ĠMatch Result ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( matcher . group Values [ 2 ] Ġ== Ġ"" Ġ&& Ġmatcher . group Values [ 6 ] Ġ== Ġ"> ") ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġis Un directed ( matcher : ĠMatch Result ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( matcher . group Values [ 2 ] Ġ== Ġ"" Ġ&& Ġmatcher . group Values [ 6 ] Ġ== Ġ"") ĊĠĠĠ Ġ} Ċ }