uncefact / spec-jsonld Goto Github PK
View Code? Open in Web Editor NEWExposing the UN/CEFACT vocabulary as web semantics
Home Page: https://service.unece.org/trade/uncefact/vocabulary/uncefact/
Exposing the UN/CEFACT vocabulary as web semantics
Home Page: https://service.unece.org/trade/uncefact/vocabulary/uncefact/
Consider these classes:
From the description it seems each is needed: one is a process, the other is the documentary result of that process.
But if you check the applicable props of uncefact:Certification
and their descriptions:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX uncefact: <https://service.unece.org/trade/uncefact/trade/uncefact/vocabulary/uncefact#>
PREFIX schema: <http://schema.org/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select * {
{?incoming schema:domainIncludes uncefact:Certification; rdfs:comment ?descr}
union {?outgoing schema:rangeIncludes uncefact:Certification; rdfs:comment ?descr}
}
incoming | descr | outgoing |
---|---|---|
uncefact:assertion | "An assertion, expressed as text, for this trade product certification, such as that this product is free from peanuts." | |
uncefact:assertionCode | "A code specifying an assertion for this trade product certification, such as claims that a product is free from peanuts." | |
uncefact:responsibleAgency | "The agency, expressed as text, responsible for this trade product certification." | |
uncefact:standard | "The standard, expressed as text, for this trade product certification." | |
"A certification applicable to this trade product." | uncefact:applicableCertification |
It becomes clear that is also the result, not a process.
Therefore the two classes must be merged.
We need to examine all classes with similar names for potential duplication.
https://gist.github.com/VladimirAlexiev/618a9bddd6a949b75b37e983f0220417#bies
The cefact:
namespace should be at unece
rather than edi3
, like the uncefact:
namespace
@prefix uncefact: <https://service.unece.org/trade/uncefact/trade/uncefact/vocabulary/uncefact#> .
@prefix cefact: <https://edi3.org/cefact#> .
cefact:
namespace doesn't reflect its purpose. Maybe it should be uncefactBIE:
? And a corresponding part in the URL: <uncefact/BIE/uncefact>
Including high level description of project goal and deliverables
uncefact:applicableObjectCode "A code specifying an object, such as item, animal, person or organization applicable for this product certificate."
How can you identify this variety of things by using a mere string? There are no established global datasets (thus ID standards) for all of these categories of things.
IMHO this should be an object prop (URL), or define an alternative uncefact:applicableObject
that's an object prop.
In contrast, GS1 will define gs1:certificationSubject
that is an object prop, see https://milecastle.media/dev2021/voc_epcis_extras/CertificationDetails.
Are there other props holding external IDs with badly defined scope/reach?
@nissimsan here's the notes from today before I left.
Nis Jesperson - 4 years in CEFACT and founder of EDI3 works in verifiable credentials. Editor of the project.
Roman Evstifeev - worked on edi3 for a few years
Kevin Bishop - from UNECE secretariat, joined 2 months ago, has background in IT a professor in computing.
David Roff - T&L Domain Co-Ordinator also supporting the BIC on API and Digital resources.
Kesenyia - EDI3 Background
Steve Capell - will join subsequent calls
Anyone can contribute to the project but official contributions must be made from a registered UN/CEFACT expert, this is a simple registration process and free to do.
Goal is to take what has been done already and get over the finish line as a project within UN/CEFACT.
Work will be done in MarkDown and output the deliverable after the work is done.
Deliverables:
Process to follow the git flows
Add the code from the RDM2API project which transforms exported legacy (CCTS) formatted BSP model to JSON-LD.
This query finds props named "binary":
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX uncefact: <https://service.unece.org/trade/uncefact/trade/uncefact/vocabulary/uncefact#>
select * {
?x a rdf:Property
bind(strafter(str(?x),str(uncefact:)) as ?xName)
filter(regex(?xName,"binary","i"))
}
There are 15, nearly equally spread between "BinaryObject" and "BinaryFile":
"attachedBinaryFile"
"attachmentBinaryObject"
"creationBinaryFile"
"descriptionBinaryObject"
"imageBinaryObject"
"includedBinaryObject"
"logoAssociatedBinaryFile"
"mapBinaryObject"
"presentationBinaryFile"
"readerBinaryFile"
"referenceFileBinaryObject"
"referencedBinaryFile"
"relatedBinaryFile"
"signatoryImageBinaryObject"
"valueBinaryFile"
Standardize on one of the names; this discrepancy has caused 2 prop duplications (attached, referenced)
Document has enough props to describe also "Document Lines", which are document parts:
lineCountNumeric
: if it's a Document, count of lines in itlineId
: if it's a DocumentLine, its line IDparentLineId
: to establish a hierarchy between linesHowever, there's no way to express a document hierarchy or parthood:
This leads to confusions such as
Document
uncefact:lineStatusReason
rdfs:comment "A reason, expressed as text, for the line status in this document line." ;
schema:domainIncludes uncefact:Document .
uncefact:lineStatusReasonCode
rdfs:comment "The code specifying the line status reason for this document line." ;
schema:domainIncludes uncefact:Document .
lineTotalBasisAmount
? Where is that "line" mentioned in the description?
Tax
has 51 attributes including basisAmount
so how can one distinguish between the two?lineTotalAmount
has domain MonetarySummation
uncefact:lineTotalBasisAmount
rdfs:comment "A monetary value used as the line total basis on which this trade related tax, levy or duty is calculated." ;
schema:domainIncludes uncefact:Tax ;
Plan for meeting cadence, add to README, incl conference details.
Formalize the requiements driving the UN/CEFACT vocab solution.
https://service.unece.org/trade/uncefact/vocabulary/unlocode-ch/#CHGVA has this info:
@id: unlocode-ch:CHGVA
@type: uncefact:UNLOCODE
Comment: Geneve
rdfs:comment: Geneve
rdf:value: CHGVA
https://locode.info/CHGVA has this info:
country: Switzerland (on wikipedia)
code: CH GVA
name: Genève
region: GE
functions: rail terminal, road terminal, airport, postal exchange
It's richer because it tells country, region, functions
and has external link (to wikipedia).
Could you please add something like this? It's easy enough to:
country
and link it to something, eg an ISO countries list, Geonames or WikidataA large amount of draft tech specification and other documentation has already been created over the recent years:
https://uncefact.unece.org/pages/viewpage.action?pageId=43384856
We must filter through this material and extract the parts which are relevant to web vocab. We don't want to re-invent any wheels.
This ticket will probably need to be subdivided.
https://gist.github.com/VladimirAlexiev/618a9bddd6a949b75b37e983f0220417#props
schema.org uses rdf:Property
because almost all of its props allow literal (text) in addition to object.
However, UNCEFACT seems to be strict in following a "property dichotomy", so use owl:ObjectProperty (797, see below) vs owl:DatatypeProperty (950).
range | c | comment |
---|---|---|
xsd:string | 791 | all literals |
xsd:token | 159 | identifiers, all end in Id |
uncefact: | 797 | uncefact classes (object props) |
Potential to implement some of the outcomes in open projects or work, for example BIC (Bureau International des Containers) https://github.com/bic-org have containers, container facilities and also BIC Code registrations which could be used to demonstrate a working example of the projects outputs.
(@nissimsan now that I know one person working on UNCEFACT linked data, I'll write this up :-)
For 20 years Rec20 published codes like KGS
. They are widely used, eg in EPCIS and numerous other eCommerce schemas.
You published Rec20 as Linked Data (thanks!) but use English URLs like:
This means one cannot link to your URLs from existing data, without having a lookup table or loading your JSONLD/RDF
Furthermore, I have to wonder about the stability of these URLs:
KMT
is appended?statute_mile_per_second_squared
or mile_(statute)_per_second_squared
?statute
same or different from UK_statute
?Thanks!
You use consistent camelCasing for props, and UpperCamelCasing for classes (good!).
However, it needs to be made smarter when dealing with UPPERCASE:
UPPERCASE abbreviations should be converted to lowercase, then camelCased as a normal word
bBANIdentificationId, bICId, australianSNIdentificationId
(wtf is BANI, ICI, SNI
?)bbanId, bicId, australianSnId
bban, bic, australianSn
Haven't looked for class names. Dunno how to catch all cases.
Props named xxxCode
come in two kinds:
prefix uncefact: <https://service.unece.org/trade/uncefact/trade/uncefact/vocabulary/uncefact#>
PREFIX schema: <http://schema.org/>
select ?range (count(*) as ?c) {
?prop schema:rangeIncludes ?range1
filter(regex(str(?prop),"Code$"))
bind(if(strstarts(str(?range1),str(uncefact:)),uncefact:,?range1) as ?range)
} group by ?range
xsd:string
: 154. Consider mapping to range xsd:token
(same as props named xxxId
).accessRightsCode xsd:string
-> xsd:token
uncefct:...
(objects, i.e. codelist values): 110. Consider renaming them to remove Code
(because objects are not codes!). Examples:
accountingDocumentSetTriggerCode uncefact:UNCL1001Code
-> accountingDocumentSetTrigger
cross-BorderRegulatoryProcedureTypeCode uncefact:UNCL9353Code
-> cross-BorderRegulatoryProcedureType
logisticsSealSealingPartyRoleCode uncefact:UNCL9303Code
-> logisticsSealSealingPartyRole
@nissimsan #24 (comment) shows a link:
https://service.unece.org/trade/uncefact/vocabulary/uncefact.jsonld whcih is broken.
More importantly, the semantic link
https://service.unece.org/trade/uncefact/vocabulary/uncefact/
should return different payload using content negotiation.
As a minimum: HTML, JSONLD and Turtle.
It's not bad to also utilize extensions, eg
https://service.unece.org/trade/uncefact/vocabulary/uncefact.html
https://service.unece.org/trade/uncefact/vocabulary/uncefact.jsonld
https://service.unece.org/trade/uncefact/vocabulary/uncefact.ttl
but it's mandatory that the single semantic URL must return the same 3 content types using content negotiation.
Eg see how we did it for the Getty 5 years ago: http://vocab.getty.edu/doc/#Semantic_Resolution
It's crucial to design the semantic URLs in a reasonable way, in order to guarantee their longevity and permanence.
Change ("break") them now so you won't have to break them in the future!
Currently UNCEFACT uses only two literal datatypes: xsd:string
(791 props) and xsd:token
(159 props).
UNCEFACT prop names are made according to ISO/IEC 11179 Metadata Registry (MDR), part 5:2015 Naming and identification principles. The last word of prop names (let's call it "kind") suggests many other datatypes.
Surely trade involves some numbers and some dates?!?
I checked that all props with kind Id
are xsd:token (good).
This query counts xsd:string
props by "kind":
PREFIX schema: <http://schema.org/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
select ?kind (count(*) as ?c) {
?prop schema:rangeIncludes xsd:string
bind(replace(str(?prop),".*([A-Z][a-z]*)","$1") as ?kind)
filter(regex(?kind,"^[A-Z]"))
} group by ?kind order by ?kind
Count and tentative proposed changes:
kind | c | change to |
---|---|---|
"Access" | 1 | |
"Agency" | 1 | |
"Amount" | 89 | numeric |
"Basis" | 2 | |
"Box" | 1 | |
"Charge" | 1 | |
"Code" | 154 | xsd:token |
"Conditions" | 1 | |
"Criteria" | 1 | |
"Date" | 3 | xsd:date |
"Description" | 21 | |
"Dimension" | 1 | |
"Five" | 1 | |
"Four" | 1 | |
"Indicator" | 73 | xsd:boolean |
"Information" | 21 | |
"Instructions" | 2 | |
"Limit" | 2 | |
"List" | 2 | |
"Means" | 1 | |
"Measure" | 66 | |
"Name" | 47 | |
"Number" | 4 | numeric |
"Numeric" | 15 | IndexNumeric, SequenceNumeric -> xsd:integer |
"Object" | 7 | |
"Of" | 2 | |
"One" | 1 | |
"Pattern" | 1 | |
"Percent" | 16 | numeric |
"Phrase" | 1 | |
"Point" | 1 | |
"Procedure" | 1 | |
"Quantity" | 91 | numeric |
"Rate" | 4 | |
"Reason" | 7 | |
"Reference" | 6 | |
"Remark" | 2 | |
"Remarks" | 1 | |
"Restriction" | 3 | |
"Result" | 1 | |
"Status" | 1 | |
"Three" | 1 | |
"Time" | 79 | xsd:dateTime |
"Title" | 1 | |
"Two" | 1 | |
"Type" | 9 | |
"Use" | 1 | |
"Value" | 1 | |
"Zone" | 1 |
Examples:
uncefact:usedToDateQuotaQuantity, uncefact:usedSignalSourceQuantity, taxBasisTotalAmount, taxBasisAllowanceRate
date
or dateTime
candidates:uncefact:occurrenceDateTime
xsd:boolean
candidates:uncefact:nilCarriageValueIndicator, uncefact:nilCustomsValueIndicator, uncefact:nilInsuranceValueIndicator
Establish .md document for capturing the text-based deliverables for bureau submission.
uncefact.jsonld wrongly defines class uncefact:UNECELOCODE
uncefact:UNLOCODE
rather than this nameuncefact:UNECELOCODE rdf:type rdfs:Class ;
rdfs:comment "LOCODE." ;
rdfs:label "UNLOCODE" .
(Continuing #5 (comment))
OGC is a stronger authority on geographic information than UNCEFACT, so it would be better to defer to OGC GeoSPARQL classes and props
asWKT
and asGML
serializations, region algebras (3 of them) and coordinate system transformations@type:@json
to capture GeoJSON opaquely in RDF (but semantic repos won't index it)What are all of the UNCEFACT classes and props related to geospatial?
uncefact:Circle , uncefact:GeographicalMultiCurve , uncefact:GeographicalPoint , uncefact:GeographicalMultiSurface , uncefact:GeographicalGrid , uncefact:GeographicalMultiPoint , uncefact:Polygon , uncefact:LinearRing , uncefact:GeographicalLine , uncefact:GeographicalSurface
Props?
uncefact:cefactUNId "cefact:UN01002518"
: maybe remove the word "cefact" from the value?
A number of UN/CEFACT terms are defined elsewhere. In order to "fit in", we should include NDRs which define for specific elements terms such as broaderThan
, narrowerThan
, equivalentProperty
, equivalentClass
, subClass
, subProperty
linking to external terms.
For example uncl1153:Bill_of_lading_number rdfs:subPropertyOf schema:identifier
See also w3c-ccg/traceability-vocab#230
I find many cases of misleading descriptions.
This is a very bad problem since it can't be fixed mechanically, but only through examination of the description of the combination "class-applicable props" (see #56 for an example of such investigation).
I'll keep adding below:
Vocab update frequency
The link from BasicBIE
to AggregateBIE
should be an object prop, not a string:
cefact:WorkItem_QuantityAnalysis.Details
rdf:type uncefact:AggregateBIE .
cefact:WorkItem_QuantityAnalysis.Identification.Identifier
rdf:type uncefact:BasicBIE ;
uncefact:cefactBieDomainClass "cefact:WorkItem_QuantityAnalysis.Details" # -> cefact:WorkItem_QuantityAnalysis.Details
@nissimsan I've reviewed the current UNCEFACT vocab and posted some notes at https://gist.github.com/VladimirAlexiev/618a9bddd6a949b75b37e983f0220417.
Maybe it's better to put this as a wiki page? This way we can track as individual issues: with issue IDs and checkboxes.
Any ideas for a better way of organizing this batch of issues is welcome!
I'll start posting individual issues based on the second section Issues
@dr-shorthair @steveraysteveray @nissimsan @mgh128
Now that we know UNECE are actively engaging in Linked Data (eg see #24),
what's the best way for the two initiatives to collaborate?
Here are some thoughts #24 (comment), please contribute more ideas or arguments.
All of the vocabs use a double-char namespace delimiter: /#
.
W3C and the Linked Data Patterns book (eg https://patterns.dataincubator.org/book/hierarchical-uris.html) have guidance on "slash vs hash" URLs. But nobody recommends using both together.
The recommendation is to use slash for large collections of terms and hash for smaller collections (since a client doesn't send the anchor after hash, so it'd get the whole collection at once).
But please consider #26
In addition to "IdentificationId" stuttering (#48), there are more insidious dublons in prop names that need fixing
formattedFormattedCancellationAnnouncedLaunchDateTime
: but see #52 for a whole familyreferenceReferenceTypeCode
documentLineDocumentLineStatusCode
Dear Team,
I just got notified of some maintenance planned for this weekend. https://service.unece.org/trade/uncefact/vocabulary/uncefact/ will be unavailable during the weekend. Jan 28th - Jan 30th 2022.
Kevin.
There are 103 props called ...Identification
:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select * {
?x a rdf:Property
filter(regex(str(?x),"Identification"))
}
Of them 99 are called "IdentificationId" (stuttering syndrome?)
Rename these 99 props by removing the parasitic word ...Identification..
from ...IdentificationId...
.
uncefact:versionIdentificationId
, bICIdentificationId
Renaming ...Indicator
to is...
won't work well:
transportEquipmentSplitGoodsIndicator
isTransportEquipmentSplitGoods
Establish an initial description of project scope.
Given there is now a formal UN repo for tracking, we probably want to bring over existing tickets from edi3.
Linked Data should describe real-world entities, not data records, data structures, messages...
I'd argue that a class like uncefact:LOCODE
is not good.
schema:State
(see example #28 (comment))uncefact:LOCODE
would be appropriate to describe that identifier (when was it assigned, who assigned it, what did they use for validation), as opposed to the real world entity that it signifies(I)
in the graph below)Currently you publish most UNECE vocabs as one big page.
https://locode.info/$1
because these guys have individual pages (eg https://locode.info/CHGVA).
https://unece.org/fileadmin/DAM/cefact/locode/id/$1
is deprecated on WDOr maybe publish both:
some uncefact:TDED "."
are void (empty) values: skip them.
And what is TDED? use words not abbreviations
Address: the breakdown lineOne, lineTwo, lineThree, lineFour
is
So merge to just one prop eg addressLines
.
This is low priority since it contradicts the desire to map UNCEFACT models as-is.
https://gist.github.com/VladimirAlexiev/618a9bddd6a949b75b37e983f0220417#prop-descriptions
Some BIE Descriptions seem to be richer than prop descriptions. Eg
cefact:Academic_Qualification.AbbreviatedName.Text a uncefact:BasicBIE ;
rdfs:comment "The abbreviated name, expressed as text, of this academic qualification." ;
uncefact:abbreviatedName a rdf:Property ;
rdfs:comment "An abbreviated name, expressed as text." ;
The BIE description could be used when the BIE is used in one term, and the term is applicable to only one class (as is the case for uncefact:abbreviatedName
: applicable only to uncefact:Qualification
)
1242 (or 1337?) of 1747 props satisfy this condition:
prefix uncefact: <https://service.unece.org/trade/uncefact/trade/uncefact/vocabulary/uncefact#>
prefix schema: <http://schema.org/>
select * {
?prop uncefact:cefactElementMetadata ?bie
filter not exists {?prop schema:domainIncludes ?dom1,?dom2 filter (?dom1 != ?dom2)}
filter not exists {?prop uncefact:cefactElementMetadata ?bie2 filter (?bie != ?bie2)}
?prop rdfs:comment ?propDescr.
?bie rdfs:comment ?bieDescr.
}
This requires further examination and unification of descriptions. Eg in the pair below:
Accreditation
: "An official recognition awarded to a person, organisation or thing, such as a building or product, to certify that a certain level of attainment has been achieved."Certified_Accreditation.Details
: "A certified recognition that provides evidence of a level of competency in a given area, such as certifying a level of skill in a trade."Related to #45:
Explicitly decide and consistently use a numeric datatype.
Don't decide as late as we did in EPCIS: gs1/EPCIS#201
ADAVL "Andorra la Vella" is published as https://service.unece.org/trade/uncefact/vocabulary/unlocode-ad/ADAVL.
The smart people at Wikidata can do such switcheroo
https://wikidata-externalid-url.toolforge.org/?p=3608&url_prefix=http://ec.europa.eu/taxation_customs/vies/vatResponse.html?memberStateCode=&id=BG200356710
)But making consumers jump through hoops just ain't right.
If you do #26, that won't be necessary
Follow-up from #48
Here are the remaining 4 props:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select * {
?x a rdf:Property
filter(regex(str(?x),"Identification"))
filter(!regex(str(?x),"IdentificationId"))
}
Proposed renaming (...Code
can only be a string, not an object!)
uncefact:allowanceChargeIdentificationTypeCode
"The code specifying the type of this trade allowance charge."UNCL5189Code
"Code specifying the identification of an allowance or charge."allowanceOrChargeType
uncefact:geoCoordinateIdentificationGeographicalCoordinate range GeoCoordinate
:geoCoordinate
uncefact:natureIdentificationCargo
: descr sounds like it's free text "Transport cargo details of the consignment or consignment item sufficient to identify its nature for customs, statistical or transport purposes."range uncefact:Cargo
,cargo
Cargo
is simply "Goods being transported." with none of that "sufficient to identify its nature" fuzziness?uncefact:uNDGIdentificationCode
: "United Nations Dangerous Goods (UNDG) number":undgCode
Include architectural section positioning UN/CEFACT vocab among other vocabs. This section will require discussion and solutioning. Include discussion of:
Many dateTime props have names called "formatted".
rangeIncludes xsd:dateTime
, not with the property nameThis query finds them, together with a better-named prop when it exists:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX uncefact: <https://service.unece.org/trade/uncefact/trade/uncefact/vocabulary/uncefact#>
select ?x ?y {
?x a rdf:Property
bind(strafter(str(?x),str(uncefact:)) as ?xName)
filter(regex(?xName,"formatted","i"))
optional {
?y a rdf:Property
bind(strafter(str(?y),str(uncefact:)) as ?yName)
filter(?xName != ?yName && regex(?xName,?yName,"i"))
}
}
I think all x
should be simplified by removing the parasitic words "formatted", and merged with y
when indicated:
x | y | note |
---|---|---|
formattedExpiryDateTime | expiryDate | maybe merge all 3 but see below |
formattedExpiryDateTime | expiryDateTime | |
formattedFormattedCancellationAnnouncedLaunchDateTime | ||
formattedFormattedIssueDateTime | issueDateTime | |
formattedFormattedLatestProductDataChangeDateTime | ||
formattedFormattedPickUpAvailabilityDateTime | formattedPickUpAvailabilityDateTime | merge & rename to pickUpAvailabilityDateTime |
formattedPickUpAvailabilityDateTime | ||
formattedFormattedReceivedDateTime | receivedDateTime | |
formattedFormattedUltimateShipToDeliveryDateTime | ultimateShipToDeliveryDateTime | |
formattedJurisdictionEntryDateTime | ||
formattedLastRegisteredYearDateTime | lastRegisteredYearDateTime | |
formattedObtainedDateTime | ||
formattedScheduledArrivalRelatedDateTime | arrivalRelatedDateTime | |
formattedScheduledArrivalRelatedDateTime | scheduledArrivalRelatedDateTime | |
formattedScheduledDepartureRelatedDateTime | departureRelatedDateTime | |
formattedScheduledDepartureRelatedDateTime | scheduledDepartureRelatedDateTime |
This puppy is really messed up:
formattedExpiryDateTime
"The date, time, date time or other date time value when this certified accreditation expires."UNCL2379Code
"Code specifying the representation of a date, time or period."expiryDateTime range xsd:dateTime
, or expiryDateTimeFormat range UNCL2379Code
???https://gist.github.com/VladimirAlexiev/618a9bddd6a949b75b37e983f0220417#duplicated-props
The props in these pairs are duplicated, so should be merged
bICId
: "The unique Bank Identification Code (BIC) as defined in ISO 9362 for this creditor or debtor financial institution."
bICIdentificationId
: "The Bank Identifier Code (BIC) as defined by ISO 9362 (Banking telecommunication messages, Bank Identifier Codes) for this financial identity."versionId
: "An identifier of the version."
versionIdentificationId
: "The unique identifier for the version of this exchanged document."attachedBinaryFile
: "A binary file attached to this exchanged or referenced document."
attachmentBinaryObject
: A binary object that is attached or otherwise appended to this referenced document."referenceDocument
referencedDocument
: haven't checked descriptionI'm sure there are more cases, how could we find them?
This is according to principle 4. deduplication
of #33 (tech-spec.md)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.